2008-10-08 10 views
17

im próbuje zlokalizować pozycję minimalnej wartości w wektorze, przy użyciu algorytmu znajdowania STL (i algorytmu min_element), ale zamiast zwracania pozycji, to właśnie daje mi wartość. Np. Jeśli jest to wartość minimalna, pozycja zostanie zwrócona jako 8 itd. Co ja tu robię źle?Pozycja w wektorze przy użyciu STL

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

Jest literówka w swoim pytaniu: mówisz, że chcesz znaleźć * maksymalna wartość * w wektorze, podczas gdy oczywiście próbujesz znaleźć * minimalną * wartość. –

Odpowiedz

34

min_element już daje iterator, nie ma potrzeby powoływania find (dodatkowo, jest to nieefektywne, ponieważ jest dwukrotnie praca). Użyj distance lub operatora -:

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

WYKONANO TAKIE SAME Z LISTĄ, ZBYT MÓJ GŁOWIĘ! CZEMU? – prakharsingh95

+3

@ prakharsingh95 Ponieważ używasz Caps Lock (i ponieważ nie przeczytałeś dokładnie mojej odpowiedzi - spróbuj 'std :: distance'). –

+0

Aha, przepraszam. Kiedy pomyślałem o tym, dlaczego tak jest, zdałem sobie sprawę, że będę musiał trzymać się operatora '-', ponieważ zakładam, że operator odległości działa na połączonych listach i będzie miał złożoność czasową' O (n) '. Pobłogosław C++ STL za niewprowadzanie '-' na połączonych listach, oszczędzając ludziom dużo czasu. – prakharsingh95

15

Oba algorytmy których używasz iteratory powrotne. Jeśli dereference iterator, można uzyskać obiekt, który jest „spiczasty” przez ten iterator, dlatego drukowanie wartości a nie pozycja robiąc

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

iterator może być postrzeganym jako wskaźnik (cóż, nie do końca, ale powiedzmy to dla uproszczenia); dlatego sam Iterator nie może podać pozycji w kontenerze. Skoro jesteś iteracji wektor, można użyć operatora minus, jak Konrad powiedział:

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

ale polecam przy użyciu algorytmu std :: odległości, która jest znacznie bardziej elastyczny i będzie działać na wszystkich standardowych pojemnikach:

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

używanie odległości jest prawidłowym sposobem. Kiedyś zaatakowałem problem używając 'operatora-', po tym jak duża zmiana rozmiaru wartości zwracanej za pomocą operatora była inna niż rzeczywista pozycja. – Florian

+0

@Florian: Czy możesz rozwinąć kwestię, którą miałeś z 'operatorem-'? O ile mi wiadomo, 'odległość' specjalizuje się w iteratorach dostępu losowego (takich jak te dostarczane przez' vector') w celu użycia '-', więc zaskakuje mnie to, że mogą dać różne wyniki. Czy na pewno używasz 'wektora'? –

7

krótka odpowiedź na to, co myślisz, zapytał: „Jak mogę określić pozycję w std::vector<> podany iterator z niego ? " jest funkcją std::distance.

Co prawdopodobnie oznaczało to zrobić, jednak było uzyskać wartość dla iterator, którą otrzymuje się przez dereferencji go:

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; 
Powiązane problemy