Программирование >>  Операторы преобразования типа 

1 ... 48 49 50 [ 51 ] 52 53 54 ... 239


Как и в случае с вектором, тип элементов дека передается в первом параметре шаблона. Допускается любой тип, поддерживающий присваивание и копирование. Необязательный второй параметр шаблона определяет модель памяти, ло умолчанию используется модель allocator (см. главу 15)

Возможности деков

По споим возможностям деки во многом отличаются от векторов.

О Вставка и удаление выполняются быстро как в начале, так и в конце (для векторов эти операции выполняются быстро только в конце). Операции выполняются с амортизированным постоянным временем.

О Внутренняя структура содержит дополнительный уровень ссылок, поэтому обращение к элементам и перемещение итератора в деках обычно выполняются чуть медленнее.

О Итераторы должны быть умными указателями особого типа. Обычные указатели не подходят из-за необходимости перехода между блоками.

О В системах с ограниченными размерами блоков памяти (например, в некоторых системах РС) дек может содержать больше элементов, поскольку он не ограничивается одним блоком памяти. Следовательно, функция max size() может возвращать для деков большую величину.

О Деки не позволяют управлять емкостью и моментом перераспределения памяти. В частности, при любых операциях вставки и удаления, выполняемых не в начале и.ли конце вектора, становятся недействительными псе указатели, ссылки и итераторы, ссылающиеся на элементы дека. Однако перераспределение памяти в общем случае выполняется более эффективно, чем для векторов, потому что из-за особенностей своей внутренней структуры декам не приходится копировать все элементы.

О Освобождение неиспользуемых блоков может привести к уменьшению объема памяти, занимаемой деком (хотя как это происходит и происходит ли вообще, зависит от реализации).

Следующие особенности векторов характерны также и для деков.

О Вставка и удаление элементов в середине контейнера выполняется относительно медленно, потому что для освобождения места или заполнения пропуска приходится перемещать элементы с обоих концов.

О Итераторы являются итераторами произвольного доступа.

Подведем итог. Выбирайте дек, если выполняются следующие условия:

О вставка элементов выполняется с обоих концов (классический пример очереди);

О в программе не используются ссылки на элементы контейнера;

О важно, чтобы контейнер освобождал неиспользуемую память (хотя стандарт таких гарантий не дает).

В системах, не поддерживающих значения по умолчанию для параметров шаблонов, второй параметр обычно отсутствует.



Интерфейс векторов и деков почти не отличается. Если в программе не используются специфические возможности вектора или дека, вы можете легко опробовать оба контейнера.

Операции над деками

в табл. 6.9-6,11 перечислены все операции, поддерживаемые деками.

Таблица 6.9. Конструкторы и деструктор деков Операция Описание

deque<Elem> с Создает пустой дек, не содержащий ни одного элемента

deque<Eiem> с1(с2) Создает копию другого дека того же типа (с копированием всех

элементов)

deque<Elem> с(п) Создает дек из п элементов, создаваемых конструктором по умолчанию

deque<Elenfi> c(n,elem) Создает дек, инициализируемый п копиями эпемента elem deque<Elem> c(beg,end) Создает дек, инициализируемый элементами интервала [beg,end) c.~deque<Elem>() Уничтожает все элементы и освобождает память

Таблица 6.10. Немодифицирующие операции над деками Операция Описание

c.size() Возвращает фактическое количество элементов

C.emptyO Проверяет, пуст ли контейнер (эквивалент size()==0, но иногда выполняется быстрее)

c.max size() Возвращает максимально возможное количество элементов

с1 == с2 Проверяет равенство с1 и с2

с1 != с2 Проверяет неравенство с1 и с2 (эквивалент !(с1==с2))

с1 < с2 Проверяет, что с1 меньше с2

с1 > с2 Проверяет, что с1 больше с2 (эквивалент с2<с1)

с1 <= с2 Проверяет, что с1 не больше с2 (эквивалент !(с2<с1))

с1 >= с2 Проверяет, что с1 не меньше с2 (эквивалент !(с1<с2))

c.at(idx) Возвращает элемент с индексом idx (при недопустимом значении индекса генерируется исключение out of range)

c[idx] Возвращает элемент с индексом idx (без интервальной проверки!)

C.frontO Возвращает первый элемент (без проверки его существования!)

с.ЬаскО Возвращает последний элемент (без проверки его существования!)

c.rbegin() Возвращает обратный итератор для первого элемента при переборе в обратном направлении

c.rendO Возвращает обратный итератор для позиции эа последним элементом

при переборе в обратном направлении



Таблица 6.11. Модифицирующие операции над деками

Операция

Описание

с1 = с2

c.assign(n,elem)

c.assign(beg,end)

cl,swap(c2)

swap(cl,c2)

c.insert(pos,elem)

c.insert(pos,n,elem)

с. i nsert( pos, beg,end)

c.push back(elem)

c.pop back()

c.push front(elem)

c.pop front()

c.erase(pos)

c.erase(beg,end)

c.resize(num)

c.resize(num,elem)

C.clearO

Присваивает cl все элементы c2 Присваивает п копий элемента elem Присваивает элементы интервала [beg,end) Меняет местами содержимое с1 и с2 То же, но в форме глобальной функции

Вставляет копию elem в позицию итератора pes и возвращает позицию нового элемента

Вставляет п копий elem в позицию итератора pes (и не возвращает значения)

Вставляет в позицию итератора pos копию всех элементов интервала [beg,end) (и не возвращает значения)

Присоединяет копию elem в конец дека

Удаляет последний элемент (не возвращая его)

Вставляет копию elem в начало дека

Удаляет первый элемент (не возвращая его)

Удаляет элемент в позиции итератора pes и возвращает позицию следующего элемента

Удаляет все элементы из интервала [beg,end) и возвращает позицию следующего элемента

Приводит контейнер к размеру num (если slze() при этом увеличивается, новые элементы создаются своим конструктором по умолчанию)

Приводит контейнер к размеру num (если size() при этом увеличивается, новые элементы создаются как копии elem)

Удаляет все элементы (контейнер остается пустым)

Операции деков отличаются от операций векторов только в следующих отношениях:

О деки не поддерживают функции, связанные с емкостью (capacityO и reserve());

О в деках определены прямые функции вставки и удаления первого элемента (push front() и рор Ьаск()).

Поскольку остальные операции остались без изменений, здесь они не рассматриваются. За описаниями обращайтесь на с. 159.

При работе с деками необходимо учитывать следующее.

О Функции обращения к элементам (кроме at()) не проверяют правильность индексов и итераторов.

О Вставка или удаление элементов может привести к перераспределению памяти. Это означает, что в результате любой вставки или удаления могут стать недействительными все указатели, ссылки и итераторы, ссылающиеся



1 ... 48 49 50 [ 51 ] 52 53 54 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика