Spec-Zone.ru › C++

Именованные требования 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 тип итератора
  • C::iterator является LegacyForwardIterator, а его тип значения — T.
  • C::iterator преобразуется в C::const_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 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 и constT. линейная
Эффект Возвращает 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, являются ConstexprIterators, операция реализуется функциями constexpr.

В выражениях 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API