Если у меня есть std::vector<int>
, я могу получить индекс минимального элемента путем вычитания двух итераторов:индекс минимального элемента в станд :: Список
int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin();
Однако, с контейнерами, которые не имеют случайных итераторы доступа, например std::list<int>
, это не работает. Конечно, можно сделать что-то вроде
int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end()));
, но затем я должен повторить дважды по списку.
Могу ли я получить индекс элемента с минимальным значением с помощью алгоритмов STL, только повторяя один раз через список или мне нужно закодировать собственный цикл for?
Зачем вам нужен индекс элемента в 'станд :: list'? –
Вы можете написать итератор, который обертывает 'list :: iterator' и отслеживает его индекс по мере его появления. Он будет ограниченным использованием, поскольку вставка/удаление элементов из контейнера приведет к аннулированию индексов, хранящихся в ваших итераторах, но вы можете использовать на нем 'min_element' и другие алгоритмы, а затем извлечь индекс из возвращаемого значения. –
Вы можете использовать 'std :: set' или отсортировать свой контейнер и всегда знать, где минимальный элемент ... – AJG85