Подтвердить что ты не робот

Существует ли алгоритм STL для поиска последнего экземпляра значения в последовательности?

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

В этом примере будет найден первый экземпляр 0 в векторе ints.

#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(). Я хочу сделать что-то подобное, но с разделом, установленным до последнего экземпляра 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(), потому что это не обратные итераторы. Есть ли способ конвертировать обратный итератор в соответствующий итератор прямого (или произвольного доступа)? Есть ли лучший способ найти последний экземпляр элемента в последовательности, чтобы я остался с совместимым итератором?

4b9b3361

Ответ 1

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

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

Ответ 2

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