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