Класс reverse_iterator
Класс reverse_iterator представляет собой адаптер итератора, который позволяет проходить контейнер в обратном направлении - от последнего элемента к первому. Он принимает в качестве параметра обычный итератор и инвертирует его поведение: операция ++ перемещает итератор к началу контейнера, а операция -- - к концу. При разыменовании reverse_iterator возвращает элемент, предшествующий текущему положению базового итератора.
Класс объявлен в заголовочном файле <iterator>. Объекты reverse_iterator обычно получают с помощью методов rbegin и rend, которые возвращают обратные итераторы на последний и первый элементы контейнера соответственно.
Синтаксис
std::reverse_iterator<Iterator> it(base_iterator);
Где Iterator - тип базового итератора, а base_iterator - исходный итератор, который будет адаптирован для обратного прохода.
Пример
Давайте создадим вектор и пройдём его в обратном направлении с помощью reverse_iterator, полученного методом rbegin:
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
for (reverse_iterator<vector<int>::iterator> it = vec.rbegin(); it != vec.rend(); ++it) {
cout << *it << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
5 4 3 2 1
Пример
Давайте создадим reverse_iterator напрямую из обычного итератора, указывающего на элемент 'c' в строке:
#include <iostream>
#include <string>
#include <iterator>
using namespace std;
int main()
{
string str = "abcde";
string::iterator base = str.begin() + 2;
reverse_iterator<string::iterator> rit(base);
cout << *rit << endl;
return 0;
}
Результат выполнения кода:
"b"
Обратите внимание: reverse_iterator разыменовывается в элемент, предшествующий базовому итератору, поэтому при базовом итераторе на 'c' мы получаем 'b'.
Пример
Давайте получим базовый итератор из reverse_iterator с помощью метода base и изменим элемент через обратный итератор:
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 5};
reverse_iterator<vector<int>::iterator> rit = vec.rbegin();
*rit = 10;
for (int num : vec) {
cout << num << " ";
}
cout << endl;
cout << *rit.base() << endl;
return 0;
}
Результат выполнения кода:
1 2 3 4 10
5
Метод base возвращает базовый итератор, который указывает на элемент, следующий за текущим элементом обратного итератора. В данном случае rit указывает на последний элемент 10, а rit.base указывает на позицию за последним элементом, поэтому разыменование даёт неопределённое поведение.
Смотрите также
-
метод
rbegin,
который возвращает обратный итератор на последний элемент контейнера -
метод
rend,
который возвращает обратный итератор на позицию перед первым элементом -
функция
make_reverse_iterator,
которая создаёт обратный итератор из обычного -
класс
iterator,
который представляет базовый интерфейс итераторов