Есть ли алгоритм STL, чтобы найти последний экземпляр значения в последовательности? - PullRequest
19 голосов
/ 24 декабря 2009

Используя STL, я хочу найти последний экземпляр определенного значения в последовательности.

Этот пример найдет первый первый экземпляр 0 в векторе целых.

#include <algorithm>
#include <iterator>
#include <vector>

typedef std::vector<int> intvec;
intvec values;
// ... ints are added to values
intvec::const_iterator split = std::find(values.begin(), values.end(), 0);

Теперь я могу использовать split для выполнения операций с поддиапазонами begin() .. split и split .. end(). Я хочу сделать что-то похожее, но с параметром split, равным last , экземпляру 0. Моим первым инстинктом было использование обратных итераторов.

intvec::const_iterator split = std::find(values.rbegin(), values.rend(), 0);

Это не работает, потому что split - это неправильный тип итератора. Итак ...

intvec::const_reverse_iterator split = std::find(values.rbegin(), values.rend(), 0);

Но проблема в том, что я не могу сделать диапазоны "head" и "tail", такие как begin(), split и split, end(), потому что это не обратные итераторы. Есть ли способ преобразовать обратный итератор в соответствующий прямой (или произвольный доступ) итератор? Есть ли лучший способ найти последний экземпляр элемента в последовательности, чтобы у меня остался совместимый итератор?

Ответы [ 2 ]

23 голосов
/ 24 декабря 2009

Но проблема в том, что я не могу сделать диапазоны "голова" и "хвост", используя begin () и end (), потому что это не обратные итераторы.

reverse_iterator::base() - это то, что вы ищете - раздел новые члены в SGIs описание обратного_тератора или здесь на cppreference.com

6 голосов
/ 24 декабря 2009

А как насчет std :: find_end ? (Чтобы найти последнее вхождение последовательности)

...