Pregunta Posición en Vector usando STL


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);

17
2017-10-08 14:09


origen


Respuestas:


min_element ya te da el iterador, no es necesario invocar find (adicionalmente, es ineficiente porque es el doble del trabajo). Utilizar distance o el - operador:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();

34
2017-10-08 14:23



Ambos algoritmos usan iteradores de retorno. Si desreferencia un iterador, obtiene el objeto que es "puntiagudo" por este iterador, por lo que imprime el valor y no el posición cuando haces

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()));

15
2017-10-09 05:55



La respuesta breve a lo que crees que has preguntado con "¿Cómo puedo determinar la posición en std::vector<> dado un iterador de ella? "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;

7