Существует ли алгоритм 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()
, потому что это не обратные итераторы. Есть ли способ конвертировать обратный итератор в соответствующий итератор прямого (или произвольного доступа)? Есть ли лучший способ найти последний экземпляр элемента в последовательности, чтобы я остался с совместимым итератором?
Ответы
Ответ 1
Но проблема в том, что я не могу сделайте диапазоны "голова" и "хвост", используя begin() и end(), потому что это не обратные итераторы.
reverse_iterator::base()
- это то, что вы ищете - раздел новых членов на описание SGIs reverse_iterator или здесь, на cppreference.com
Ответ 2
Как насчет std:: find_end? (Чтобы найти последнее вхождение последовательности)