2012-03-13 2 views
6

Если у меня есть 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?

+15

Зачем вам нужен индекс элемента в 'станд :: list'? –

+0

Вы можете написать итератор, который обертывает 'list :: iterator' и отслеживает его индекс по мере его появления. Он будет ограниченным использованием, поскольку вставка/удаление элементов из контейнера приведет к аннулированию индексов, хранящихся в ваших итераторах, но вы можете использовать на нем 'min_element' и другие алгоритмы, а затем извлечь индекс из возвращаемого значения. –

+2

Вы можете использовать 'std :: set' или отсортировать свой контейнер и всегда знать, где минимальный элемент ... – AJG85

ответ

1

Вы должны написать свою собственную функцию, например:

template <class ForwardIterator> 
    std::size_t min_element_index (ForwardIterator first, ForwardIterator last) 
{ 
    ForwardIterator lowest = first; 
    std::size_t index = 0; 
    std::size_t i = 0; 
    if (first==last) return index; 
    while (++first!=last) { 
    ++i; 
    if (*first<*lowest) { 
     lowest=first; 
     index = i; 
    } 
    } 
    return index; 
} 
Смежные вопросы