Spec-Zone.ru › C++

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
a.size() == b.size() &&

std::equal(a.begin(),
a.

end(), b.begin())
(до C++14)
std::equal(a.begin(), a.end(),
b.begin(), b.end())
(с C++14)
Пред: 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() Постоянная
Примечания
  1. (с C++11) Линейная для std::array
  2. Всегда линейная для std::forward_list
  3. (до C++11) Не строго постоянная

Учитывая

  • i и j, объекты типа iterator контейнера,

в выражениях i == j, i != j, i < j, i <= j, i >= j, i > j, i - j, один или оба объекта можно заменить объектом типа const_iterator контейнера, ссылающимся на тот же элемент, без изменения семантики.

Взаимоблокировки данных контейнера

см. безопасность потоков контейнеров

Другие требования

C (Контейнер)

  • DefaultConstructible
  • CopyConstructible
  • EqualityComparable
  • Swappable

T (Тип)

  • CopyInsertable
  • EqualityComparable
  • Destructible

Отчёты об ошибках

Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам 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

Spec-Zone.ru

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