2008-10-08 15 views
17

Estoy intentando localizar 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í?Posición en Vector utilizando STL

int value = *min_element(v2.begin(), v2.end()); 
cout << "min value at position " << *find(v2.begin(), v2.end(), value); 
+0

hay un error tipográfico en su pregunta: usted dice que quiere encontrar la * valor * máximo en un vector, mientras que obviamente está tratando de encontrar el valor * mínimo *. –

Respuesta

34

min_element ya se le da el iterador, hay necesidad de invocar find (además, es ineficaz porque es el doble de trabajo). Utilice distance o el operador -:

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

INTENTÉ LO MISMO CON LA LISTA, ¡BLEW MY HEAD OFF! ¿POR QUÉ? – prakharsingh95

+3

@ prakharsingh95 Debido a que está usando mayúsculas y minúsculas (y porque no leyó mi respuesta cuidadosamente, intente con 'std :: distance'). –

+0

Aha, lo siento. Cuando pensé en por qué es así, me di cuenta de que tendré que apegarme al operador '-' ya que supongo que el operador de distancia está operando en listas enlazadas y tendrá una complejidad temporal de' O (n) '. Bendice C++ STL por no implementar '-' en las listas enlazadas, ahorrándoles a las personas mucho tiempo. – prakharsingh95

15

Ambos algoritmos que estés utilizando iteradores de retorno. Si eliminar la referencia de un iterador, se obtiene el objeto que es "puntas" de este iterador, por lo que se imprime el valor y no posición al hacer

cout << "min value at position " << *find(v2.begin(), v2.end(), value); 

Un iterador puede ser visto 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. Puesto que usted está iterando un vector, se puede utilizar el operador menos, como dijo Konrad:

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

pero recomendaría utilizando el algoritmo std :: distancia, que es mucho más flexible y trabajará en todos los contenedores estándar:

cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end())); 
+0

utilizando la distancia sería la forma correcta de hacerlo. Una vez encontré un problema al usar el 'operador-', después de mucho redimensionar el valor de retorno usando el operador era diferente de la posición real. – Florian

+0

@Florian: ¿Puede explicar el problema que tuvo con 'operator-'? Hasta donde yo sé, 'distance' está especializado para iteradores de acceso aleatorio (como los proporcionados por' vector') para usar '-', por lo que me sorprende que puedan dar resultados diferentes. ¿Estás seguro de que estabas usando un 'vector'? –

7

La respuesta corta a lo que cree que le pida 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 destinado a hacer, sin embargo, era conseguir el valor para el repetidor, que se obtiene por eliminación de referencias que:

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; 
Cuestiones relacionadas