Контейнеры
Контейнеры - это объекты, которые содержат другие объекты. Они управляют размещением в памяти и свобождением этих объектов через конструкторы, деструкторы, операции вставки и удаления.
В следующей таблице мы полагаем, что X - контейнерный класс, содержащий объекты типа T, a и b - значения X, u - идентификатор, r - значение X&.
выражение | возвращаемый тип | семантика исполнения | утверждение/примечание состояние до/после |
сложность |
X::value_type | Т | . | . | время компиляции |
X::reference | . | . | . | время компиляции |
X::const_refe rence |
. | . | . | время компиляции |
X::pointer | тип указателя, указывающий на X::reference | . | указатель на T в модели памяти, используемой контейнером | время компиляции |
X::iterator | тип итратора, указывающий на X::reference | . | итератор любой категории, кроме итератора вывода. | время компиляции |
X::const_iter ator |
тип итератора, указывающий на X:: const_reference |
. | постоянный итератор любой категории, кроме итератора вывода. | время компиляции |
X::difference _type |
знаковый целочисленный тип | . | идентичен типу расстояния X::iterator и X::const_iterator | время компиляции |
X::size_type | беззнаковый целочисленный тип | . | size_type может представлять любое неотрицательное значение difference_type | время компиляции |
X u; | . | . | после: u.size() == 0. | постоянная |
X() | . | . | X().size() == 0. | постоянная |
X(a) | . | . | a == X(a). | линейная |
X u(a); X u == a; |
. | X u; u = a; | после: u == a. | линейная |
(&a)->~X() | результат не используется | . | после: a.size() == 0. примечание: деструктор применяется к каждому элементу a, и вся память возвращается. |
линейная |
a.begin() | iterator; const_iterator для постоянного a |
. | . | постоянная |
a.end() | iterator; const_iterator для постоянного a |
. | . | постоянная |
a == b | обратимый в bool | a.size() == b.size() && equal(a.begin(), a.end(), b.begin()) |
== - это отношение эквивалентности. примечание: eqial определяется в разделе алгоритмов. |
линейная |
a != b | обратимый в bool | !(a == b) | . | линейная |
r = a | X& | if(&r != &a) { (&r)-> X::~X(); new (&r) X(a); return r; } |
после: r == a. | линейнaя |
a.size() | size_type | size_type n = 0; distance (a.begin(), a.end(), n); return n; |
. | постоянная |
a.max_size() | size_type | . | size() самого большого возможного контейнера. | постоянная |
a.empty() | обратимый в bool | a.size() == 0 | . | постоянная |
a < b | обратимый в bool | lexicographical _compare (a.begin(), a.end(), b.begin(), b.end()) |
до: определён для значений T. - отношение полного упорядочения. lexicographical _compare определяется в разделе алгоритмов. |
линейная |
a > b | обратимый в bool | b < a | . | линейнaя |
a | обратимый в bool | !(a > b) | . | линейная |
a >= b | обратимый в bool | !(a < b) | . | линейная |
a.swap(b) | void | swap(a, b) | . | постоянная |
Функция-член size() возвращает число элементов в контейнере. Её семантика определяется правилами конструкторов, вставок и удалений.
begin() возвращает итератор, ссылающийся на первый элемент в контейнере. end() возвращает итератор, который является законечным.
Если тип итератора контейнера принадлежит к категории двунаправленных итераторов или итераторов произвольного доступа, то контейнер называется reversible (обратимым) и удовлетворяет следующим дополнительным требованиям:
выражение | возвращаемый тип | семантика исполнения | сложность |
X::reverse _iterator | . | reverse_iterator для итератора произвольного доступа. reverse_bidirectional_iteratoriterator, value_type, reference, difference_type> для двунаправленного итератора | время компиляции |
X::const_r everse_ite rator |
. | reverse_iterator для итератора произвольного доступа. reverse_bidirectional_iteratorconst_iterator, value_type, const_reference, difference_type> для двунаправленного итератора. |
время компиляции |
a.rbegin() | reverse_iterator; const_reverse_iter ator для постоянного a |
reverse_iterator(end()) | постоянная |
a.rend() | reverse_iterator; const_reverse_iter ator для постоянного a |
reverse_iterator(begin()) | постоянная |