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