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

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


на другие элементы дека. Дагпюе утверждение не относится к вставке элементов в нача.т1о или конец дека - в этом случае ссылки и указатели на элементы (но не итераторы!) остаются действительными.

Обработка исключений

в принципе возможности обработки исключений в деках аналогичны соответствующим возможностям векторов (см. с, 164). Дополнительные операции push front() и pop front() ведут себя аналогично операциям push back() и рор Ьаск() соответственно. Таким образом, стандартная библиотека С++ обеспечивает следующие гарантии:

О если при вставке элемента функцией push back() или push front() происходит исключение, эти функции не вносят изменений;

О функции рор Ьаск() и pop front() не генерируют исключений.

На с. 148 приведены общие сведения об обработке исключений в STL, а на с. 254 перечислены все контейнерные операции, для которых предоставляются особые гарантии в отношении исключений.

Примеры использования деков

Ниже приводится простой пример, демонстрирующий практическое применение деков.

cont/dequel,cpp #1nclude <iostream> #include <deque> #1nclude <string> finclude <algorithni> using namespace std:

int mainO {

Создание пустого дека для хранения строк deque<string> col 1:

Вставка нескольких элементов coll.assign (3, stringCstring )); coll.push back ( last string ): coll.push front ( first string );

Вывод элементов с разделением символом новой строки сору (coll.beginO. coll.endO.

ostreami terator<stri ng>(cout. \n )): cout endl:

Удаление первого и последнего элементов



coll .pop front(); coll,pop back();

Вставка another во все эпененты, кроме первого for (unsigned 1=1; i<coll .sizeO: ++i) { colUi] = another + coll[i];

Увеличение размера до четырех элементов coll.resize (4, resized string );

Вывод элементов с разделением символом новой строки сору (coll,beginO. coll.endO.

ostream iterator<string>(cout. \n ));

Результат выполнения программы выглядит так;

first string string string string last string

string

another string another string resized string

Списки

Элементы контейнера list библиотеки STL объединены в двусвязный список (рис. 6.4). Как обычно, эта реализация ие указана в спецификации стандартной библиотеки С++, но обусловлена ограничениями и требованиями, предъявляемыми к контейнеру этого типа.

Рис. 6.4. Структура списка

Чтобы ncnoJrb30BaTb список в про]рамме, необходимо включить в нее заголовочный файл <list>:

#include <vector>

В исходно!! версии STL список определялся в заголовочно.ч файле <Ust.h>.



Тип списка определяется как шаблон класса в пространстве имен std:

namespace std {

template <class Т.

class Allocator = allocator<T> > class list;

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

Возможности списков

По своей внутренней структуре списки полностью отличаются от векторов и деков. Важнейигие различия перечислены ниже.

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

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

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

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

Эти принципиальные различия отражены в функциях списков, что делает их непохожими на функции векторов и деков.

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

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

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

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



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

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