Индекс минимального элемента в std :: list - PullRequest
7 голосов
/ 13 марта 2012

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

1 Ответ

1 голос
/ 13 марта 2012

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

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;
}
...