Namespaces
Variants

C++ named requirements: Container

From cppreference.net
C++ named requirements

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 ) ;

Предусловие

Если v не является rvalue типа C , T должен быть CopyInsertable в C .

(начиная с C++11)
линейная [1]
Постусловие
  • Если v является lvalue, c == v равно true .
  • Если v является rvalue , и c и v не ссылаются на один и тот же объект (начиная с C++11) , c равно значению, которое v имело до этой конструкции.
Примечания
  1. Если v является rvalue типа C , и C не является специализацией std::array или std::inplace_vector , сложность является константной.

Выражения

Выражение Тип Семантика Сложность
C ( ) C Постусловие C ( ) . empty ( ) является true . константа
C ( v ) C Условие

Если v не является rvalue типа C , T должен быть CopyInsertable в C .

(начиная с C++11)
константная [1]
Постусловие
  • Если v является lvalue, C ( v ) == v равно true .
  • Если v является rvalue , и C ( v ) и v не ссылаются на один и тот же объект (начиная с C++11) , C ( v ) равно значению, которое v имело до этой конструкции.
lhs = v C& Постусловие
  • Если v является lvalue, lhs == v равно true .
  • Если v является rvalue , и lv и v не ссылаются на один и тот же объект (начиная с C++11) , lhs равно значению, которое v имело до этого присваивания.
линейная
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 Эффект Возвращает
u. size ( ) == v. size ( ) &&
std:: equal ( u. begin ( ) ,
u. end ( ) , v. begin ( ) )
(до C++14)
std:: equal ( u. begin ( ) , u. end ( ) ,
v. begin ( ) , v. end ( ) )
(начиная с C++14)
.
линейная [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] .
Примечания
  1. Если v является rvalue типа C , и C является специализацией std::array или std::inplace_vector , сложность является линейной.
  2. Если u. size ( ) ! = v. size ( ) является true , сложность является постоянной.
  3. Если C является специализацией std::array или std::inplace_vector , сложность является линейной.
  4. Количество элементов определяется правилами конструкторов, вставок и удалений. Оно равно значению std:: distance ( v. begin ( ) , v. end ( ) ) .
  5. Если итераторы, переданные в std::lexicographical_compare_three_way являются ConstexprIterator s , операция реализуется с помощью constexpr функций.

В выражениях 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++ для Библиотеки контейнеров