Для любого шаблона распределителя Alloc имеется определение для типа void. У Alloc‹void› определены только конструктор, деструктор и Alloc‹void›::pointer. Преобразования определены из любого Alloc‹T›::pointer в Alloc‹void›::pointer и обратно, так что для любого p будет p == Alloc‹T›::pointer(Alloc‹void›::pointer(p)).
Распределитель по умолчанию (The default allocator)
template ‹class T›
class allocator {
public:
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
allocator();
~allocator();
pointer address(reference x);
const_pointer const_address(const_reference x);
pointer allocate(size_type n);
void deallocate(pointer p);
size_type init_page_size();
size_type max_size();
};
class allocator‹void› {
public:
typedef void* pointer;
allocator();
~allocator();
};
Предполагается, что в дополнение к allocator поставщики библиотеки обеспечивают распределители для всех моделей памяти.
Контейнеры - это объекты, которые содержат другие объекты. Они управляют размещением в памяти и свобождением этих объектов через конструкторы, деструкторы, операции вставки и удаления.
В следующей таблице мы полагаем, что X - контейнерный класс, содержащий объекты типа T, a и b - значения X, u - идентификатор, r - значение X&.
Таблица 8. Требования контейнеров
выражение |
возвращаемый тип |
семантика исполнения |
утверждение/примечание состояние до/после |
сложность |
X::value_type |
Т |
- |
- |
время компиляции |
X::reference |
- |
- |
- |
время компиляции |
X::const_reference |
- |
- |
- |
время компиляции |
X::pointer |
тип указателя, указывающий на X::reference |
- |
указатель на T в модели памяти, используемой контейнером |
время компиляции |
X::iterator |
тип итератора, указывающий на X::reference |
- |
итератор любой категории, кроме итератора вывода. |
время компиляции |
X::const_iterator |
тип итератора, указывающий на 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()) |
== - это отношение эквивалентности. примечание: equal определяется в разделе алгоритмов. |
линейная |
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 ‹= b |
обратимый в bool |
!(a › b) |
- |
линейная |
a ›= b |
обратимый в bool |
!(a ‹ b) |
- |
линейная |
a.swap(b) |
void |
swap(a, b) |
- |
постоянная |
Функция-член size() возвращает число элементов в контейнере. Её семантика определяется правилами конструкторов, вставок и удалений.
begin() возвращает итератор, ссылающийся на первый элемент в контейнере. end() возвращает итератор, который является законечным.
Если тип итератора контейнера принадлежит к категории двунаправленных итераторов или итераторов произвольного доступа, то контейнер называется reversible (обратимым) и удовлетворяет следующим дополнительным требованиям:
Читать дальше