Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 65
Текст из файла (страница 65)
Для соединения (Join) двух списков нужна функция splice(), а для слияния (merge) — функция merge().Для любого типа данных, которые вы собираетесь хранить в списке, долженбыть определен конструктор по умолчанию. Кроме этого, необходимо определить различные операторы сравнения. К моменту написания этой книгиточные требования к объектам, предназначенным для хранения в списке, уразных компиляторов были разными, поэтому перед использованием спискатщательно изучите техническую документацию на ваш компилятор.Таблица 14.3.
Функции — члены класса listФункция-членОписаниеtemplate<class lnlter>void assignflnlter начало,Inlter конец);Присваивает списку последовательность, определенную итераторами начало и конецtemplate<class Size, class T>void assign (Size число,const Т &значение - T());Присваивает списку число элементов, причемзначение каждого элемента равно параметрузначениеreference b a c k ( ) ;const__reference backf) const;Возвращает ссылку на последний элементспискаiterator beginf);constjterator begin() const;Возвращает итератор первого элемента спискаvoid clear();Удаляет все элементы спискаbool emptyO const;Возвращает истину, если вызывающий списокпуст, в противном случае возвращает ложьiterator cnd();const_iterator end() const;Возвращает итератор конца спискаIterator erasefiterator /);Удаляет элемент, на который указывает итератор /.
Возвращает итератор элемента, который расположен следующим за удаленнымiterator erasefiterator начало^iterator конец);Удаляет элементы, заданные между итераторами начало и конец. Возвращает итераторэлемента, который расположен следующим запоследним удаленнымreference frontf);const_reference front() const;Возвращает ссылку на первый элемент спискаallocator_typeget_allocator() const;Возвращает распределитель памяти спискаГлава 14. Библиотека стандартных шаблонов437Таблица 14.3 (продолжение)Функция-членОписаниеiterator insertflterator i,const Т &значение = Т());Вставляет параметр значение перед элементом, заданным итератором /. Возвращает итератор элементаvoid insert(iterator j,size_type число,const Т &значение);Вставляет число копий параметра значениеперед элементом, заданным итератором itemplate<class lnlter>void insert(iterator /,Inlter начало,Inlter конец);Вставляет последовательность, определеннуюмежду итераторами начало и конец, передэлементом, заданным итератором isize_type max_size() const;Возвращает максимальное число элементов,которое может храниться в спискеvoid merge(list<T,Allocator> &объект);template<class Comp>void merge(llst<T,Allocator> &объект,Comp ф^сравн);Выполняет слияние упорядоченного списка,хранящегося в объекте объект, с вызывающим упорядоченным списком.
Результат упорядочивается. После слияния список, хранящийся в объекте объект становится пустым.Во второй форме для определения того, является ли значение одного элемента меньшим,чем значение другого, может задаватьсяфункция сравнения ф_сравнvoid pop_back();Удаляет последний элемент спискаvoid pop_front();Удаляет первый элемент спискаvoid push_back(constТ ^значение);Добавляет в конец списка элемент, значениекоторого равно параметру значениеvoid p u sh__f го nt( constТ & значение);Добавляет в начало списка элемент, значениекоторого равно параметру значениеreversejterator rbeginf);const.reversejteratorrbeglnO const;Возвращает обратный итератор конца спискаvoid remove(constУдаляет из списка элементы, значения которых равны параметру значениеtemplate<class UnPred>void remove_lf(UnPred пред);Удаляет из списка значения, для которых истинно значение унарного предиката предreversejterator rend();const_reverse_iteratorrendO const;Возвращает обратный итератор начала спискаvoid resize(size_type число,Т значение = T());Изменяет размер списка в соответствии спараметром число.
Если при этом списокудлиняется, то добавляемые в конец спискаэлементы получают значение, заданное параметром значениеvoid reverse!);Выполняет реверс (т. е. реализует обратныйпорядок расположения элементов) вызывающего спискаТ &значение);Самоучитель C++438Таблица 14.3 (продолжение)Функция-членОписаниеsizejtype size() const;Возвращает хранящееся на данный момент всписке число элементовvoid sort();Сортирует список. Во второй форме для определения того, является ли значение одногоэлемента меньшим, чем значение другого,можетзадаватьсяфункциясравненияф_сравнtemplate<class Comp>void sort Comp ф_сравн);void splicefiterator /,list<T, AHocator> &объекг);Вставляет содержимое объекта объект в вызывающий список. Место вставки определяется итератором /.
После выполнения операцииобъект становится пустымvoid spllcefiterator i,list<T, Allocator> &объект,iterator элемент);Удаляет элемент, на который указывает итератор элемент, из списка, хранящегося вобъекте объект, и сохраняет его в вызывающем списке. Место вставки определяетсяитератором /void splicefiterator /,list<T, Allocator> Лобьскг,iterator начало,iterator конец);Удаляет диапазон элементов, обозначенныйитераторами начало и конец, из списка,хранящегося в объекте объект, и сохраняетего в вызывающем списке. Место вставкиопределяется итератором /void swap(list<T,Allocator> & объект);Обменивает элементы из вызывающего списка с элементами из объекта объектvoid unlque();template<class BinPred>void unique(BinPred пред);Удаляет из вызывающего списка парные элементы, Во второй форме для выяснения уникальности элементов используется предикатпредрПримеры1.
Ниже представлен пример простого списка.// Основные операции списка^include <iostream>^include <list>using namespace std;int main i)list*^char> 1st; // создание пустого спискаint i;for{i=0; i<!0; i++) 1st .push_back ( 'A' + i)cout « "Размер = " « 1st.
size () « endl;Глава 14. Библиотека стандартных шаблонов439list<char>::iterator p;cout « "Содержимое: ";while(!1st.empty(}) {p = lst.begin();cout « *p;1st.pop f r o n t ( ) ;return 0;После выполнения программы на экране появится следующее:Размер = 10Содержимое: ABCDEFGHIJВ этой программе создается список символов. Сначала создается пустой список. Затем туда помещается десять символов (буквы от А до J включительно).Зга операция выполняется с помощью функции push_back(), которая помещает каждое следующее значение в конец существующего списка.
Далее размер списка выводится на экран. После этого организуется вывод на экрансодержимого списка, для чего каждый раз последовательно извлекают, выводят на экран и удаляют очередной первый элемент списка. Этот процесспродолжается, пока список не опустеет.2. В предыдущем примере, пройдя список от начала до конца, мы его опустошили. Это, конечно, не обязательно.
Ниже представлена переработаннаяверсия программы.#include <iostream>^include <list>using namespace std;int main{)list<char> 1st;int i;for{i=0; i<10; i++) 1st-push_back('A1 + i};cout « "Размер = " « 1st.size () « endl;list<char>::iterator p = lst.begin{);cout « "Содержимое: ";while(p != 1st.end(}) {cout « *p;440Самоучитель C++return 0;J.В данной программе итератор р инициализируется таким образом, чтобы онуказывал на начало списка, Затем при каждом проходе цикла итератор р инкрементируется, что заставляет его указывать на следующий элемент списка.Цикл завершится, когда итератор р укажет на конец списка.3. Поскольку список является двунаправленным, размещать элементы в немможно как с начала списка, так и с его конца.
В следующей программе создается два списка, причем во втором списке организуется обратный первомупорядок расположения элементов.// Элементы можно размещать не только начиная с начала списка,// но также и начиная с его конца^include <iostream>^include <list>using namespace std;int main()(list<char> 1st;list<char> revlst;int i;for(i=0; i<10; i-H-) 1st .push_back ('A' + i) ;cout « "Размер прямого списка = " « 1st.size () « endl;cout « "Содержимое прямого списка: ";list<char>;:iterator p;// Удаление элементов из первого списка//и размещение их в обратном порядке во втором спискеwhile(!1st.empty{)) {р = 1st.begin();cout « *р;1st.pop_front!);revlst.push_front(*p);}cout « endl;cout « "Размер обратного списка = ";cout « revlst.size() « endl;cout « "Содержимое обратного списка: ";р = revlst.begin();while(р != revlst.end{)) {cout « *p;P+-H;Глава14.Библиотекастандартныхшаблонов_ 447return 0;1После выполнения программы на экране появится следующее:Размер прямого списка = 10Содержимое прямого списка: ABCDEFGHIJРазмер обратного списка = 10Содержимое обратного списка: JIHGFEDCBAВ данной программе реверс списка 1st достигается следующим образом: элементы поочередно извлекаются из начала списка 1st и размешаются в началесписка revlst.
Таким образом в списке revlst реализуется обратный порядокрасположения элементов.4. Вызвав функцию-член sortQ, вы можете отсортировать список. В следующейпрограмме создается список случайных символов, а затем эти символы сортируются.// Сортировка списка^include <iostream>^include <list>tinclude <cstdlib>using namespace std;int main(){list<char> 1st;int i ;// заполнение списка случайными символамиfor(i=0; i<10; i++) 1st .push_back ( 'A' + (rand { ) %26) } ;cout « "Исходное содержимое : " ;list<char>: : iterator p = Ist.beginf);while (p != 1st.
end!) ) {cout « *p;cout « endl;// сортировка списка1st . sort ( } ;cout « "Отсортированное содержимоеp = lst.begin() ;while (p != 1st. end () ) {cout « *p;442_СамоучительC++return 0;)После выполнения программы на экране появится следующее:Исходное содержимое : PHQGHUMEAYОтсортированное содержимое: AEGHHMPQQY5. Отсортированный список можно слить с другим. В результате будет полученновый отсортированный список с содержимым, состоящим из содержимогообоих исходных списков.
Новый список остается в вызывающем списке, авторой список оказывается пустым. Ниже представлен пример слияния двухсписков. В первом находятся символы ACEGI, а во втором — BDFHJ. Послеслияния мы получим последовательность ABCDEFGHIJ.// Слияние двух списков^include <io5tream>#include <list>using namespace std;int main ( ){list<char> Istl, Ist2;int i;for (1=0; i<10; i+=2) Istl .push_back ( 'A1 + i) ;for (1=1; i<ll; i+=2) Ist2 .push_back ( 'A' + i) ;cout « "Содержимое первого списка :list<char>; : iterator p = Istl.