Именованные требования C++: ReversibleContainer
ReversibleContainer — это Container, итераторы которого удовлетворяют требованиям LegacyBidirectionalIterator или LegacyRandomAccessIterator. Такие итераторы позволяют перебирать ReversibleContainer в обратном порядке.
Требования
Тип удовлетворяет требованиям ReversibleContainer, если он удовлетворяет требованиям Container, его тип итератора относится к двунаправленной или случайного доступа категории итераторов, а для следующих типов и значений выполняются семантические требования и требования к сложности из таблиц ниже:
| Тип | Определение |
|---|---|
X | тип ReversibleContainer |
T | value_type типа X |
| Значение | Определение |
a | значение типа X |
Типы
| Имя | Тип | Требования |
|---|---|---|
| typenameX::reverse_iterator | std::reverse_iterator<X::iterator> | тип итератора, тип значения которого — T |
| typenameX::const_reverse_iterator | std::reverse_iterator<X::const_iterator> | тип константного итератора, тип значения которого — T |
Выражения
Типы reverse_iterator и const_reverse_iterator в следующей таблице обозначают соответственно typenameX::reverse_iterator и typenameX::const_reverse_iterator.
| Выражение | Тип | Семантика | Сложность |
|---|---|---|---|
a.rbegin() |
reverse_iteratorconst_reverse_iterator для константного a |
reverse_iterator(a.end()) | Константная |
a.rend() |
reverse_iteratorconst_reverse_iterator для константного a |
reverse_iterator(a.begin()) | Константная |
a.crbegin() |
const_reverse_iterator |
const_cast<const X&>(a).rbegin() | Константная |
a.crend() |
const_reverse_iterator |
const_cast<const X&>(a).rend() | Константная |
Типы стандартной библиотеки
Следующие типы стандартной библиотеки удовлетворяют требованиям ReversibleContainer:
|
(C++11) | массив фиксированного размера, непрерывно размещённый в памяти (шаблон класса) |
| двусторонняя очередь (шаблон класса) |
|
| двусвязный список (шаблон класса) |
|
| изменяемый по размеру массив с непрерывным размещением в памяти (шаблон класса) |
|
|
(C++26) | массив с непрерывным размещением в памяти, изменяемым размером и фиксированной ёмкостью (шаблон класса) |
| набор пар «ключ — значение», отсортированных по ключам; ключи уникальны (шаблон класса) |
|
| набор пар «ключ — значение», отсортированных по ключам (шаблон класса) |
|
| набор уникальных ключей, отсортированных по ключам (шаблон класса) |
|
| набор ключей, отсортированных по ключам (шаблон класса) |
Пример
В следующем примере выполняется обход vector (у которого есть устаревшие итераторы произвольного доступа) в обратном порядке.
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = {3, 1, 4, 1, 5, 9};
for (std::vector<int>::const_reverse_iterator i{v.crbegin()}; i != v.crend(); ++i)
std::cout << *i << ' ';
std::cout << '\n';
}
Вывод:
9 5 1 4 1 3
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2105 | C++98 |
typenameX::const_reverse_iterator должен был быть типом итератора со значением типа constT | должен быть типом константного итератора со значением типа T |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/ReversibleContainer