Положение в векторе с использованием STL - PullRequest
17 голосов
/ 08 октября 2008

Я пытаюсь найти положение минимального значения в векторе, используя алгоритм поиска STL (и алгоритм min_element), но вместо того, чтобы возвращать позицию, он просто дает мне значение. Например, если это минимальное значение, будет ли позиция возвращена как 8 и т. Д. Что я здесь не так делаю?

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

Ответы [ 3 ]

34 голосов
/ 08 октября 2008

min_element уже дает вам итератор, нет необходимости вызывать find (кроме того, это неэффективно, потому что это вдвое больше) Используйте distance или оператор -:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
15 голосов
/ 08 октября 2008

Оба алгоритма вы используете возвращающие итераторы. Если вы разыменовываете итератор, вы получаете объект, «указываемый» этим итератором, поэтому вы печатаете значение , а не position при выполнении

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

Итератор можно рассматривать как указатель (ну, не совсем, но, скажем так, для простоты); следовательно, один итератор не может дать вам позицию в контейнере. Поскольку вы перебираете вектор, вы можете использовать оператор минус, как сказал Конрад:

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

но я бы порекомендовал использовать алгоритм std :: distance, который намного более гибок и будет работать на всех стандартных контейнерах:

cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end()));
7 голосов
/ 09 октября 2008

Короткий ответ на вопрос, который, по вашему мнению, вы задали: «Как мне определить позицию в std::vector<> с учетом итератора из нее?» это функция std::distance.

Однако, вероятно, вы хотели получить значение для итератора, которое можно получить, разыменовав его:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...