C++ именованные требования: Контейнер
Объект Контейнер используется для хранения других объектов и отвечает за управление памятью, используемой содержащимися в нём объектами.
Требования
-
T, тип элемента; -
C, тип Контейнера, содержащего элементы типаT; -
aиb, объекты типаC; -
rv, выражение prvalue типаC.
Типы
| Имя | Тип | Требования |
|---|---|---|
value_type | T | CopyConstructible(до C++11)Erasable(с C++11) |
reference | T& | |
const_reference | const T& | |
iterator | Итератор, тип значения которого — T
|
LegacyForwardIterator приводимый к const_iterator |
const_iterator | Постоянный итератор, тип значения которого — T
| LegacyForwardIterator |
difference_type | Целое со знаком | Должно совпадать с iterator_traits::difference_type для iterator и const_iterator |
size_type | Целое без знака | Достаточно большое, чтобы представлять все положительные значения difference_type |
Члены-функции и операторы
| Выражение | Тип возвращаемого значения | Семантика | Условия | Сложность | ||||
|---|---|---|---|---|---|---|---|---|
C() | C | Создаёт пустой контейнер | Пост: C().empty()== true
| Постоянная | ||||
C(a) | C | Создаёт копию a
| Пред: T должен быть CopyInsertable Пост: a == C(a)
| Линейная | ||||
C(rv)(с C++11) | C | Перемещает rv
| Пост: эквивалентно значению, которое у rv было до этого построения | Постоянная[1] | ||||
a = b | C& | Удаляет или копирует-присваивает все элементы a из элементов b
| Пост: a == b
| Линейная | ||||
a = rv(с C++11) | C& | Удаляет или перемещает-присваивает все элементы a из элементов rv
| Пост: если a и rv не ссылаются на один и тот же объект, то a эквивалентно значению, которое у rv было до этого присваивания | Линейная | ||||
a.~C() | void | Удаляет все элементы a и освобождает всю память | Линейная | |||||
a.begin() | (const_)iterator | Итератор на первый элемент a
| Постоянная | |||||
a.end() | (const_)iterator | Итератор на позицию после последнего элемента a
| Постоянная | |||||
a.cbegin()(с C++11) | const_iterator | const_cast<const C&>(a).begin() | Постоянная | |||||
a.cend()(с C++11) | const_iterator | const_cast<const C&>(a).end() | Постоянная | |||||
a == b | Приводимо к bool |
| Пред: T должен быть EqualityComparable
| Постоянная[2] если a.size() !=b.size(), в противном случае линейная |
||||
a != b | приводимо к bool | !(a == b) | Линейная | |||||
a.swap(b) | void | Обменивает значения a и b
| Постоянная[1][3] | |||||
swap(a, b) | void | a.swap(b) | Постоянная[1] | |||||
a.size() | size_type | std::distance(a.begin(), a.end()) | Постоянная[3] | |||||
a.max_size() | size_type |
b.size() где b — максимально возможный контейнер | Постоянная[3] | |||||
a.empty() | Приводимо к bool | a.begin() == a.end() | Постоянная | |||||
| Примечания | ||||||||
|
||||||||
Учитывая
-
iиj, объекты типаiteratorконтейнера,
в выражениях i == j, i != j, i < j, i <= j, i >= j, i > j, i - j, один или оба объекта можно заменить объектом типа const_iterator контейнера, ссылающимся на тот же элемент, без изменения семантики.
Взаимоблокировки данных контейнера
см. безопасность потоков контейнеров
Другие требования
C (Контейнер)
T (Тип)
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, опубликованное в документе | Корректное поведение |
|---|---|---|---|
| LWG 179 | C++98 |
iterator и const_iterator типы могут быть несопоставимы | требуется сопоставимость |
| LWG 276 | C++98 |
T должно было быть CopyAssignable |
T должно быть CopyConstructible |
| LWG 322 | C++98 | типы значений iterator и const_iterator не были указаны | указаны как T |
| LWG 774 | C++98 | не было требований к swap(a, b) | добавлены |
| LWG 883 | C++98 |
a.swap(b) было определено как swap(a, b),что приводило к циклическому определению | определено как обмен значениями a и b |
| LWG 1319 | C++98 |
iterator и const_iteratorмогут не иметь гарантии многократного прохода | они должны соответствовать требованиям LegacyForwardIterator |
| LWG 2263 | C++11 | решение LWG issue 179 случайно было пропущено в C++11 | восстановлено |
| LWG 2839 | C++11 | перемещающая самоприсваивание стандартных контейнеров было недопустимо | допустимо, но результат не определён |
См. также
Документация по C++ для Containers library |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/Container