2008-10-08 5 views
17

en essayant de localiser la position de la valeur minimale dans un vecteur, en utilisant l'algorithme de recherche STL (et l'algorithme min_element), mais au lieu de retourner la position, il me donne juste la valeur. Par exemple, si la valeur minimale est la suivante, la position sera-t-elle retournée comme 8 etc. Qu'est-ce que je fais de mal ici?Positionner dans Vector en utilisant STL

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

Il y a une faute de frappe dans votre question: vous dites que vous voulez trouver le * valeur maximale * dans un vecteur, alors que vous essayez évidemment de trouver la valeur * minimum *. –

Répondre

34

min_element déjà vous donne le iterator, nul besoin d'invoquer find (en plus, il est inefficace, car il est deux fois le travail). Utilisez distance ou l'opérateur -:

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

J'ai essayé la même chose avec la liste, éclairer ma tête! POURQUOI? – prakharsingh95

+3

@ prakharsingh95 Parce que vous utilisez le verrouillage des majuscules (et parce que vous n'avez pas lu attentivement ma réponse - essayez 'std :: distance'). –

+0

Aha, désolé. Quand j'ai pensé à pourquoi, je me suis rendu compte que je devais m'en tenir à l'opérateur '-' car je suppose que l'opérateur de distance opère sur des listes chaînées et aura une complexité temporelle de' O (n) '. Bless C++ STL pour ne pas implémenter '-' sur les listes chaînées, ce qui économise beaucoup de temps. – prakharsingh95

15

Les deux algorithmes que vous utilisez itérateurs de retour. Si vous déréférencer un itérateur, vous obtenez l'objet qui est « pointé » par ce iterator, qui est la raison pour laquelle vous imprimez la valeur et non la position lorsque vous faites

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

Itérateur peut être vu comme un pointeur (eh bien, pas exactement, mais disons-le par souci de simplicité); par conséquent, un itérateur seul ne peut pas vous donner la position dans le conteneur. Puisque vous itérer un vecteur, vous pouvez utiliser l'opérateur moins, comme Konrad dit:

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

mais je vous recommande d'utiliser l'algorithme std :: distance, ce qui est beaucoup plus souple et fonctionnera sur tous les conteneurs standards:

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

en utilisant la distance serait la bonne façon de le faire. Une fois, j'ai rencontré un problème en utilisant le 'opérateur-', après beaucoup de redimensionnement de la valeur de retour en utilisant l'opérateur était différent de la position réelle. – Florian

+0

@Florian: Pouvez-vous élaborer sur le problème que vous avez eu avec 'operator-'? Pour autant que je sache, 'distance 'est spécialisé pour les itérateurs à accès aléatoire (comme ceux fournis par' vector') pour utiliser '-', donc ça m'étonne qu'ils puissent donner des résultats différents. Etes-vous sûr d'utiliser un 'vecteur'? –

7

La réponse courte à ce que vous pensez que vous avez demandé avec « Comment puis-je déterminer la position dans std::vector<> donné un itérateur de celui-ci ? " est la fonction std::distance.

Qu'est-ce que vous vouliez probablement dire à faire, cependant, était d'obtenir la valeur de la iterator, que vous obtenez en déréférencement il:

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;