Подтвердить что ты не робот

Позиция в векторе с использованием STL

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

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

Ответ 1

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

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

Ответ 2

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

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()));

Ответ 3

Короткий ответ на то, что, по вашему мнению, вы задали с помощью "Как определить позицию в 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;