РУКОВОДСТВО ПО СТАНДАРТНОЙ БИБЛИОТЕКЕ ШАБЛОНОВ (STL)
Шрифт:
Последовательности (Sequences)
Последовательность - это вид контейнера, который организует конечное множество объектов одного и того же типа в строгом линейном порядке. Библиотека обеспечивает три основных вида последовательных контейнеров: vector (вектор), list (список) и deque (двусторонняя очередь). Она также предоставляет контейнерные адаптеры, которые облегчают создание абстрактных типов данных, таких как стеки или очереди, из основных видов последовательностей (или из других видов последовательностей, которые пользователь может сам определить).
В следующих двух таблицах X - последовательный класс, a - значение X, i и j удовлетворяют требованиям итераторов ввода, [i, j) - допустимый диапазон, n - значение X::size_type, p - допустимый итератор для a, q -
Сложности выражений зависят от последовательностей.
Таблица 10. Требования последовательностей (в дополнение к контейнерам)
выражение | возвращаемый тип | утверждение/примечание состояние до/после |
---|---|---|
X(n, t) X a(n, t); | – | после: size==n. создаёт последовательность с n копиями t. |
X(i, j) X a(i, j); | – | после: size==расстоянию между i и j. создаёт последовательность, равную диапазону [i, j). |
a.insert(p, t) | iterator | вставляет копию t перед p. возвращаемое значение указывает на вставленную копию. |
a.insert(p, n, t) | результат не используется | вставляет n копий t перед p. |
a.insert(p, i, j) | результат не используется | вставляет копии элементов из диапазона [i, j) перед p. |
a.erase(q) | результат не используется | удаляет элемент, указываемый q. |
a.erase(ql, q2) | результат не используется | удаляет элементы в диапазоне [ql, q2). |
vector (вектор), list (список) и deque (двусторонняя очередь) выдвигают программисту различные предложения сложности и должны использоваться соответственно. vectоr - тип последовательности, которая используется по умолчанию. list нужно использовать, когда имеются частые вставки и удаления из середины последовательности, deque - структура данных для выбора, когда большинство вставок и удалений происходит в начале или в конце последовательности.
Типы iterator и const_iterator для последовательностей должны быть, по крайней мере, из категории последовательных итераторов.
Таблица 11. Необязательные операции последовательностей
выражение | возвращаемый тип | семантика исполнения | контейнер |
---|---|---|---|
a.front | reference; const_reference для постоянного a | *a.begin | vector, list, deque |
a.back | reference; const_reference для постоянного a | *a.(--end) | vector, list, deque |
a.push_front(t) | void | a.insert(a.begin, t) | list, deque |
a.push_back(t) | void | a.insert(a.end, t) | vector, list, deque |
a.pop_front | void | a.erase(a.begin) | list, deque |
a.pop_back | void | a.erase(--a.end) | vector, list, deque |
a[n] | reference; const_reference
| *(a.begin + n) | vector, deque |
Все операции в расположенной выше таблице обеспечиваются только для контейнеров, для которых они занимают постоянное время.
Вектор (Vector)
vector - вид последовательности, которая поддерживает итераторы произвольного доступа. Кроме того, он поддерживает операции вставки и удаления в конце с постоянным (амортизированным) временем; вставка и удаление в середине занимают линейное время. Управление памятью обрабатывается автоматически, хотя для улучшения эффективности можно давать подсказки.