c++ - librería - Posición en Vector usando STL
reference c++ vector (3)
min_element
ya te proporciona el iterador, no es necesario invocar el find
(adicionalmente, es ineficiente porque duplica el trabajo). Use distance
o el operador -
:
cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
Estoy tratando de ubicar la posición del valor mínimo en un vector, usando el algoritmo de búsqueda STL (y el algoritmo min_element), pero en lugar de devolver la posición, simplemente me da el valor. Por ejemplo, si el valor mínimo es, la posición se devolverá como 8, etc. ¿Qué estoy haciendo mal aquí?
int value = *min_element(v2.begin(), v2.end());
cout << "min value at position " << *find(v2.begin(), v2.end(), value);
La respuesta corta a lo que piensas que hiciste con "¿Cómo determino la posición en std::vector<>
dado un iterador?" es la función std::distance
.
Lo que probablemente quisiste hacer, sin embargo, fue obtener el valor para el iterador, que obtienes desreferenciando:
using namespace std;
vector<int>::const_iterator it = min_element(v2.begin(), v2.end());
cout << "min value at position " << distance(v2.begin(), it) << " is " << *it;
Ambos algoritmos usan iteradores de retorno. Si desreferencia un iterador, obtiene el objeto que es "señalado" por este iterador, por lo que imprime el valor y no la posición al hacer
cout << "min value at position " << *find(v2.begin(), v2.end(), value);
Un iterador se puede ver como un puntero (bueno, no exactamente, pero digamos que por simplicidad); por lo tanto, un iterador solo no puede darle la posición en el contenedor. Como está iterando un vector, puede usar el operador menos, como dijo Konrad:
cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
pero recomendaría usar el algoritmo std :: distance, que es mucho más flexible y funcionará en todos los contenedores estándar:
cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end()));