C++ named requirements: Container
A Container — это объект, используемый для хранения других объектов и отвечающий за управление памятью, используемой содержащимися в нём объектами.
Содержание |
Требования
Даны следующие типы и значения:
| Тип | Определение |
T
|
тип объекта |
C
|
класс контейнера, содержащий объекты типа
T
|
| Значение | Определение |
| u , v |
значения типа
C
или
const
C
|
| mv |
значение типа
C
|
| cv | значение типа const C |
| lhs , rhs |
lvalue типа
C
|
| i , j |
значения типа
C::iterator
или
const
C
::
iterator
|
C
удовлетворяет требованиям
Container
если следующие типы, операторы и выражения являются корректно сформированными и обладают указанной семантикой:
Типы
| Тип | Определение | Требования |
|---|---|---|
| typename C :: value_type |
T
|
T
является
CopyConstructible
(до C++11)
Erasable
из
C
(с C++11)
.
|
| typename C :: reference |
T&
|
Явных требований нет |
| typename C :: const_reference | const T & | |
| typename C :: iterator | тип итератора |
|
| typename C :: const_iterator | тип константного итератора |
C::const_iterator
является
LegacyForwardIterator
, и его
тип значения
- это
T
.
|
| typename C :: difference_type | знаковый целочисленный тип |
C::difference_type
совпадает с
типом разности
для
C::iterator
и
C::const_iterator
.
|
| typename C :: size_type | беззнаковый целочисленный тип |
C::size_type
достаточно велик, чтобы представлять все неотрицательные значения
C::difference_type
.
|
Операторы
| Операция | Семантика | Сложность | |||
|---|---|---|---|---|---|
|
C c
;
C c = C ( ) ; |
Постусловие | c. empty ( ) равно true . | константная | ||
|
C c
(
v
)
;
C 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
)
swap ( lhs, 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
и
const
T
.
|
линейная | ||||
| Эффект |
Возвращает
std::
lexicographical_compare_three_way
(
u.
begin
(
)
, u.
end
(
)
,
v.
begin
(
)
, v.
end
(
)
,
synth-three-way
)
[5]
.
|
|||||||
| Примечания | ||||||||
|
||||||||
В выражениях
i
==
j
,
i
!
=
j
,
i
<
j
,
i
<=
j
,
i
>=
j
,
i
>
j
и
i
-
j
, если
i
и/или
j
заменены на итераторы типа
C::const_iterator
, указывающие на один и тот же элемент соответственно, семантика остается неизменной.
Гонки данных контейнеров
См. container thread safety .
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам 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++
для
Библиотеки контейнеров
|