|
Программирование >> Операторы преобразования типа
на другие элементы дека. Дагпюе утверждение не относится к вставке элементов в нача.т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(). О Списки не поддерживают операции, связанные с емкостью и перераспределением памяти, потому что такие операции просто не нужны. У каждого э.тс-мента имеется собственная память, которая остается действительной до удаления элемента. О Списки поддерживают много специальных функций для перемещения элементов. Эти функции класса представляют собой оптимизированные версии одноименных универсальных алгоритмов. Оптимизация основана на замене указателей вместо копирования и перемещения значений. В системах, не поддерживающих значения по умолчанию /уш параметров пгаблпрюв, второй параметр обычно отсутствует.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |