Именованные требования C++: Container
Контейнер — это объект, используемый для хранения других объектов и управления памятью, используемой содержащимися в нём объектами.
Требования
Для следующих типов и значений:
| Тип | Определение |
|---|---|
T | тип объекта |
C | класс контейнера, содержащего объекты типа T |
| Значение | Определение |
u, v | значения типа C или constC |
mv | значение типа C |
cv | значение типа constC |
lhs, rhs | lvalue типа C |
i, j | значения типа C::iterator или constC::iterator |
C удовлетворяет требованиям Container, если следующие типы, операторы и выражения корректны и обладают указанной семантикой:
Типы
| Тип | Определение | Требования |
|---|---|---|
| typenameC::value_type |
T |
T является CopyConstructible(до C++11)Erasable из C(начиная с C++11). |
| typenameC::reference |
T& | Явных требований нет |
| typenameC::const_reference | constT& | |
| typenameC::iterator | тип итератора |
|
| typenameC::const_iterator | тип константного итератора |
C::const_iterator является LegacyForwardIterator, а его тип значения — T. |
| typenameC::difference_type | знаковый целочисленный тип |
C::difference_type совпадает с типом разности C::iterator и C::const_iterator. |
| typenameC::size_type | беззнаковый целочисленный тип |
C::size_type достаточно велик, чтобы представлять все неотрицательные значения C::difference_type. |
Операторы
| Оператор | Семантика | Сложность | |||
|---|---|---|---|---|---|
C c;
| Постусловие |
c.empty() равно true. | константная | ||
C c(v);
| Предусловие |
| линейная[1] | ||
| Постусловие |
|
||||
| Примечания | |||||
|
|||||
Выражения
| Выражение | Тип | Семантика | Сложность | |||||
|---|---|---|---|---|---|---|---|---|
C() |
C | Постусловие |
C().empty() равно true. | константная | ||||
C(v) |
C | Предусловие |
| константная[1] | ||||
| Постусловие |
|
|||||||
lhs = v |
C& | Постусловие |
| линейная | ||||
v.~C() | void | Эффект | Уничтожает все элементы v и освобождает всю выделенную память. | линейная | ||||
mv.begin() |
C::iterator | Эффект | Возвращает итератор, указывающий на первый элемент mv. | константная | ||||
cv.begin() |
C::const_iterator | Эффект | Возвращает итератор, указывающий на первый элемент cv. | константная | ||||
mv.end() |
C::iterator | Эффект | Возвращает итератор за последним элементом mv. | константная | ||||
cv.end() |
C::const_iterator | Эффект | Возвращает итератор за последним элементом cv. | константная | ||||
v.cbegin()(начиная с C++11) |
C::const_iterator | Эффект | Возвращает const_cast<const C&>(v).begin(). | константная | ||||
v.cend()(начиная с C++11) |
C::const_iterator | Эффект | Возвращает const_cast<const C&>(v).end(). | константная | ||||
i <=> j(начиная с C++20) |
std::strong_ordering | Ограничение | Это выражение должно быть корректным только в том случае, если C::iterator удовлетворяет требованиям к итераторам произвольного доступа. | константная | ||||
u == v | bool | Эффект | Возвращает
| линейная[2] | ||||
u != v | Эффект | Эквивалентно !(u == v). |
||||||
lhs.swap(rhs)
| void | Эффект | Обменивает содержимое lhs и rhs. | константная[3] | ||||
v.size() |
C::size_type | Эффект | Возвращает количество элементов[4] в v. | константная | ||||
v.max_size() |
C::size_type | Эффект | Возвращает количество элементов в контейнере типа C максимально возможного размера. | константная | ||||
v.empty() | bool | Эффект | Возвращает v.begin() == v.end(). | константная | ||||
| Необязательные требования к контейнерам (предусмотрены только для некоторых типов контейнеров) |
||||||||
u <=> v(начиная с C++20) |
synth-three-way-result<C::value_type> | Предусловие | Либо T моделирует three_way_comparable, либо operator< является отношением полного порядка, определённым для значений типа T и constT. | линейная | ||||
| Эффект | Возвращает std::lexicographical_compare_three_way[5]. |
|||||||
| Примечания | ||||||||
|
||||||||
В выражениях i == j, i != j, i < j, i <= j, i >= j, i > j и i - j, если i и/или j заменить итераторами типа C::const_iterator, указывающими соответственно на один и тот же элемент, семантика остаётся неизменной.
Гонки данных в контейнерах
См. потокобезопасность контейнеров.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам 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 2114 (P2167R3) | C++98 | допускались типы возвращаемых значений некоторых функций, отличные от bool | не допускаются |
| LWG 2182 | C++98 | типы, обозначенные reference иconst_reference, были описаны недостаточно точно | формулировка уточнена |
| LWG 2257 | C++98 | для сравнения двух контейнеров на равенство требовалось линейное время, даже если их размеры различались | в этом случае требуется только константное время |
| LWG 2263 | C++11 | решение LWG issue 179 было случайно исключено из C++11 | восстановлено |
| LWG 2839 | C++11 | самоприсваивание перемещением стандартных контейнеров не допускалось | допускается, но результат не специфицирован |
| N3346 | C++11 |
от C::value_type требовалось соответствие Destructible | требуется соответствие Erasable из C |
См. также
| Документация C++ для библиотеки контейнеров |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/Container