Ответ 1
min_element
уже дает вам итератор, не нужно вызывать find
(кроме того, он неэффективен, потому что он дважды работает). Используйте оператор distance
или -
:
cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
im пытается найти положение минимального значения в векторе, используя алгоритм поиска STL (и алгоритм min_element), но вместо того, чтобы возвращать позицию, это просто дает мне значение. Например, если это минимальное значение, позиция будет возвращена как 8 и т.д. Что я здесь делаю неправильно?
int value = *min_element(v2.begin(), v2.end());
cout << "min value at position " << *find(v2.begin(), v2.end(), value);
min_element
уже дает вам итератор, не нужно вызывать find
(кроме того, он неэффективен, потому что он дважды работает). Используйте оператор distance
или -
:
cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
Оба алгоритма вы используете возвратные итераторы. Если вы разыскиваете итератор, вы получаете объект, который "заострен" этим итератором, поэтому вы печатаете значение, а не позицию при выполнении
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()));
Короткий ответ на то, что, по вашему мнению, вы задали с помощью "Как определить позицию в 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;