Категория bidirectional_iterator
Категория bidirectional_iterator описывает
двунаправленный итератор. Такой итератор умеет
не только перемещаться вперед по последовательности,
как forward_iterator, но и назад. Это
достигается за счет поддержки оператора
декремента --. Двунаправленные итераторы
используются в таких контейнерах, как list,
set, map и других. В отличие от
random_access_iterator, двунаправленный
итератор не поддерживает произвольный доступ
и арифметику указателей.
Синтаксис
template <class It>
concept bidirectional_iterator = /* ... */;
Категория задается через концепт
std::bidirectional_iterator, который
определен в заголовочном файле
<iterator>.
Пример
Давайте создадим список и пройдемся по нему сначала вперед, а затем назад с помощью двунаправленного итератора:
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> lst = {1, 2, 3, 4, 5};
cout << "Forward: ";
for (auto it = lst.begin(); it != lst.end(); ++it) {
cout << *it << " ";
}
cout << endl;
cout << "Backward: ";
auto it = lst.end();
while (it != lst.begin()) {
--it;
cout << *it << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
"Forward: 1 2 3 4 5"
"Backward: 5 4 3 2 1"
Пример
Давайте проверим, что итератор списка
удовлетворяет концепту
bidirectional_iterator с помощью
статической проверки:
#include <iostream>
#include <list>
#include <iterator>
using namespace std;
int main()
{
using It = list<int>::iterator;
if constexpr (bidirectional_iterator<It>) {
cout << "It is bidirectional" << endl;
} else {
cout << "It is not bidirectional" << endl;
}
It it = list<int>{1, 2, 3}.begin();
--it;
cout << *it << endl;
return 0;
}
Результат выполнения кода:
"It is bidirectional"
3
Смотрите также
-
категория
forward_iterator,
которая позволяет двигаться только вперед -
категория
random_access_iterator,
которая поддерживает произвольный доступ -
функция
prev,
которая возвращает предыдущий итератор -
функция
next,
которая возвращает следующий итератор