2008-10-08 5 views
17

Ich versuche, die Position des Mindestwerts in einem Vektor zu finden, mit STL find-Algorithmus (und der min_element Algorithmus), aber anstatt die Position zurück, es gibt mir nur den Wert. ZB wenn der Minimalwert ist, wird die Position als 8 zurückgegeben usw. Was mache ich hier falsch?Position im Vektor mit STL

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

Es ist ein Tippfehler in Ihrer Frage: Sie sagen, Sie wollen, dass die finden * Maximaler * Wert in einem Vektor, während Sie offensichtlich versuchen, den * minimalen * Wert zu finden. –

Antwort

34

min_element gibt Ihnen bereits den Iterator, keine Notwendigkeit, find aufrufen (zusätzlich, es ist ineffizient, weil es die doppelte Arbeit ist). Verwenden Sie distance oder - Betreiber:

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

ICH VERSUCHTE DIE SELBEN MIT LISTE, BLEW MEIN KOPF OFF! WARUM? – prakharsingh95

+3

@ prakharsingh95 Weil Sie Caps Lock verwenden (und weil Sie meine Antwort nicht sorgfältig gelesen haben - versuchen Sie 'std :: distance'). –

+0

Aha, Entschuldigung. Als ich darüber nachdachte, warum es so ist, wurde mir klar, dass ich mich an den '-'-Operator halten muss, da ich annahm, dass der Entfernungsoperator auf verknüpften Listen operiert und eine Zeitkomplexität von' O (n) 'hat. Bless C++ STL für die Implementierung von '-' auf verknüpften Listen, spart den Leuten viel Zeit. – prakharsingh95

15

Beide Algorithmen Sie Rückkehr Iteratoren verwenden. Wenn Sie dereferenzieren einen Iterator, können Sie das Objekt erhalten, das „spitze“ dieses Iterator ist, weshalb drucken Sie den Wert und nicht die Position wenn

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

Ein Iterator kann als ein Zeiger (naja, nicht genau, aber sagen wir der Einfachheit halber); Daher kann ein Iterator allein Ihnen nicht die Position im Container geben. Da Sie einen Vektor sind iterieren, können Sie den Minus-Operator verwenden, wie Konrad sagte:

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

aber ich würde empfehlen, die std :: Distanz-Algorithmus, die viel flexibler ist und funktioniert auf allen Standard-Container:

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

mit der Entfernung wäre der richtige Weg, es zu tun. Ich habe einmal ein Problem mit dem 'Operator-' gefunden, nach einer großen Größenänderung der Rückgabewert mit dem Operator war anders als die tatsächliche Position. – Florian

+0

@Florian: Können Sie das Problem, das Sie mit 'operator-' hatten, näher erläutern? Soweit ich weiß, ist "distance" auf Random-Access-Iteratoren spezialisiert (wie die von "vector"), um '-' zu verwenden, so dass es mich überrascht, dass sie unterschiedliche Ergebnisse liefern könnten. Bist du sicher, dass du einen 'Vektor' benutzt hast? –

7

Die kurze Antwort auf das, was Sie denken, Sie fragte: „Wie kann ich feststellen, Position in std::vector<> ein Iterator von ihm gegeben " ist die Funktion std::distance.

Was Sie wahrscheinlich zu tun bedeutete, war jedoch der Wert für den Iterator zu erhalten, die Sie von dereferencing es bekommen:

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; 
Verwandte Themen