Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 65
Текст из файла (страница 65)
Списки Класс 1ь1 поддерживает двунаправленный линейный список. В отличии от вектора, в котором реализован произвольный доступ, к элементам списка доступ может быль только последовательным. Поскольку списки являются двунаправленными, доступ к элементам списка возможен с обеих его сторон. Ниже представлена спецификация шаблона для класса 1Ы: геар1аге<с1аве Т, с1аяя А11осаяог = а11осагог~Т>>с1аве 11яя Здесь Т вЂ” это тип данных, предназначенных для хранения в списке, а ключевое слово АИосагог задает распределитель памяти, который по умолчанию является стандартным распределителем памяти.
В классе 1Ы определены следующие конструкторы: ехр11сьс 11вЕ(соовг А11осасог яа АХ1осагог()) ехр11сте 11ве (аква г)(ре число, сояяс т ааначааве = тО, сояяе А11осасог ва = А11осагог()); 1гвг(сопег 11яс~т, М1осагог>йо((веге); геар1аге<с1аве 1а1гег>1гег(1отгег начало, тптгаг гонец, сосяя А11осаяог йьа = А11осаеог() ) ' Первая форма представляет собой конструктор пустого списка.
Вторая форма — конструктор списка, число элементов которого — это число, а каждый элемент равен значению значение, которое может быть значением по умолчанию. Третья форма конструктора предназначена для списка из одинаковых элементов, каждый из которых — это обьектн.
Четвертая форма — это конструктор списка, содержащего диапазон элементов, заданный итераторами начало и конец. Самоучитель Сч-ч- 436 Для класса )Ы определяются следующие операторы сравнения: Таблица т4.3. Функции — члены класса Иа( Функция-член Описание Присваивает списку последовательность, оп- ределенную итераторами начало и конец 1епт р! а1е(с! авв 1п!1ег> чоЫ авв1яп(!пйег начало, 1пиег конец); 1егпр1а1е<с!ааа 81ве, с!авв Т> чоЫ авв1яп (81ае число, сопв1 Т йэначение - Т()); Присваивает списку число элементов, причем значение каждого элемента равно параметру эначание Возвращает ссылку на последний элемент списка гегегепсе Ьаси(); сопв1 ге(агепсе Ьаск() сопв1; Возвращает итератор первого элемента спи- ска нега1ог Ье о1п () ! сопв1 Иегаеог Ьея!п() сопв1; Удаляет все элементы списка чо1ггЗ с1еат(); Ьоо) еп1р1у() сопв1; Возвращает истину, если вызывающий список пуст, в противном случае возвращает ложь Возвращает итератор конца списка Ьтега1ог еп!![)! сопв1 Иега1ог ап!!() сопв1; Удаляет элемент, на который указывает ите- ратор /.
Возвращает итератор элемента, кото- рый расположен следующим за удаленным нега1ог агаве(Иега1ог (); Негагог егаве(нега1ог начало, 11ега1ог «онац); Удаляет элементы, заданные между итерато- рами начало и конец. Возвращает итератор элемента, который расположен следующим за последним удаленным Возвращает ссылку на первый элемент списка ге1егепсе (гоп1(); сопв1 гегегепсе ггоп1() сопв1; апоса1ог 1уре яе1 аноса1ог() сопв1; Возвращает распределитель памяти списка В табл. 14.3 представлены функции — члены класса))в(.
Размешать элементы в конце списка можно с помощью функции раз)! Ьас(10 (как и в случае с вектором), в начале — с помощью функции рм)! (гоя1(), а в середине — с помощью функции!пзег((). Для соединения (3от) двух списков нужна функция вр))сеО, а для слияния (тлегяе) — функция 1ветееО.
Для любого типа данных, которые вы собираетесь хранить в списке, должен быть определен конструктор по умолчанию. Кроме этого, необходимо определить различные операторы сравнения. К моменту написания этой книги точные требования к объектам, предназначенным для хранения в списке, у разных компиляторов были разными, поэтому перед использованием списка тщательно изучите техническую документацию на ваш компилятор. Глава 14.
Библиотека стандартных шаблонов 437 Функция-член Описание Вставляет параметр значение перед элемен- том, заданным итератором 1. Возвращает ите- ратор элемента Вставляет число копий параметра значение перед элементом, заданным итератором ! Вставляет последовательность, определенную между итераторами начало и конец, перед элементом, заданным итератором 1 Возвращает максимальное число элементов, которое может храниться в списке Выполняет слияние упорядоченного списка, хранящегося в объекте объект, с вызывающим упорядоченным списком.
Результат упорядочивается. После слияния список, хранящийся в объекте объект становится пустым. Во второй форме для определения того, является ли значение одного элемента меньшим, чем значение другого, может задаваться функция сравнения ф сравн чо!б рор Ьаск()! чоЫ рср 1гоп1()! Удаляет последний элемент списка Удаляет первый элемент списка Добавляет в конец списка элемент, значение которого равно параметру значение Добавляет в начало списка элемент, значение которого равно параметру значение Возвращает обратный итератор конца списка Удаляет из списка элементы, значения кото- рых равны параметру значение Удаляет из списка значения, для которых ис- тинно значение унарного предиката пред Возвращает обратный итератор начала списка Изменяет размер списка в соответствии с параметром число.
Если при этом список удлиняется, то добавляемые в конец списка элементы получают значение, заданное параметром значение Выполняет реверс (т. е. реализует обратный порядок расположения элементов) вызываю- щего списка чоЫ гечегве()1 НегаЬ>г 1пвег1(11ега1ог /, сопв1 Т йзиаЧЕНие = Т())1 чо!д 1пвег1(11ега1ог ц в!зе 1уре число, сопв1 Т йзначение); 1еп!р!а1е<о1авв 1лиег> чо1б 1пвег1(!1ега1ог /, !пнег начало, 1п11ег конец); в!зе 1уре !пах в1ве() сопв1; чоЫ тегяе(нв1<Т, А11оса1ог> йебъеКГ); 1е!пр1а1е<с1ввв Сотпр> чо1б !пег9е(!1в1<Т, А1!оса1ог> йобъект, Сотар ф„срази); чоЫ рцвЬ„Ьаск(сопв1 Т йзначение); чоЫ рцвп 1гоп1(сопв1 Т й значение); гечегве 11ега1ог гЬеп(п(); сопв1 гечегве 11ега1ог гЬея1п[) сопв1; чоЫ гезпОче(сспв1 Т йзначение); 1еп1р1а1е<с!авв ()пРгеб> чоЫ ге1поче 11(УпРгед пред); гечегве Нега1ог гепх!(); сопв1 гечегве Нега1ог говд() сопв1; чо1с3 гев(зе(в(ае 1уре число, Т значение = Т()); Таблица !4.
3(продолжение) Функция-член Описание Возвращает хранящееся на данный момент в списке число элементов в(ав Фуре в(ае() сопв1; Сортирует список. Во второй форме для определения того, является ли значение одного элемента меньшим, чем значение другого, может задаваться функция сравнения ф сравн Вставляет содержимое объекта объект в вы- зывающий список. Место вставки определяет- ся итератором Й После выполнения операции объект становится пустым Удаляет элемент, на который указывает итератор элемент, из списка, хранящегося в объекте объект, и сохраняет его в вызывающем списке.
Место вставки определяется итератором 1 Удаляет диапазон элементов, обозначенный итераторами начала и конец, из списка, хранящегося в объекте объект, и сохраняет его в вызывающем списке. Место вставки определяется итератором / Обменивает элементы из вызывающего спи- ска с элементами из объекта объект Удаляет из вызывающего списка парные эле- менты, Во второй форме для выяснения уни- кальности элементов используется предикат пред ~)яД$р !.
Ниже представлен пример простого списка. тпь патп () 11я1<сйаг> 1зъ; // создание пустого списка тпс год(1=-ор 1<10; 1 -~) 1ят,роя)з )зас)ь( 'А' ь 1); сои « "Размер —.- " « 1я1. ятге () « епб1; уо!б аогФ(); 1егпр1а1е<с(авв Сотар> чо1б вог1 Согпр ф сравн); чо(б эрнов(11егаФог /, Пв1<Т, АПосаФог> Йобъвкт); чоЫ врнсе(11егаФог 1, Пв1<Т, АносаФог> Йобъект, Иега1ог влемект); чоЫ врнсе(11егаФог ), Пв1<Т, АносаФог> Йобъект, Иега1ог начало, ИегаФог конец); чоЫ вччар(нв1<Т, Аноса1ог> Й объект)," чо1б в и (осе () 1 Фегпр1а1е<с1авв В1пРгеб> чоЫ цп(яие(В1пргеб пред); Осноянь*е операции списка 41пс1ис)е <1оя1кеата> ()1ПС1ПГ)Е <11яГ> цятпо пажеярасе ясб; Самоучитель С++ Таблица 14.
З(продолжение) Глава 14. Библиотека стандартных шаблонов 11яс<сЬат>::1тепасог р; сон( « "Содержимое: "; иЬ11е (! 1яс. елбарсу () ) р = 1яС.Ьед1п(); сон( « "р; 1яС.рор йгопс(); те(итп 0; После выполнения программы на экране появится следующее: Размер = 10 Содержимое: тм>С()еГбк1д В этой программе создается список символов. Сначала создается пустой список.
Затем туда помещается десять символов (буквы от А до Л включительно). Эта операция выполняется с помощью функции рпяЬ ЬасЦ), которая помещает каждое следующее значение в конец существующего списка. Далее размер списка выводится на экран. После этого организуется вывод на экран содержимого списка, для чего каждый раз последовательно извлекают, выводят на экран и удаляют очередной первый элемент списка.
Этот процесс продолжается, пока список не опустеет. 2. В предыдущем примере, пройдя список от начала до конца, мы его опустошили. Это, конечно, не обязательно. Ниже представлена переработанная версия программы. ((1пс1ис(е <1оясгеап~> ()1пс1оое <11яс> пяупд папеярасе яЫ; 1пс п~а1п() 11яс<сЬаг> 1яя; Ьзя йок(1=01 1<10; 1++) 1яс.рпяЬ ЬасК('й' + 1) г сопя « "Размер = " « 1яь.я1яе () « епй1; 11яс<сЬаг>:."1сегатог р = 1яС.Ьеогп(); сопя « "Содержимое: м)т11е(р 1= 1яс.епс1() ) ( сопя « *р~ р+-~-; Самоучитель С++ тетитп О; В данной программе итератор р инициализируется таким образом, чтобы он указывал на начало списка, Затем при каждом проходе цикла итератор р инкрементнруется,что заставляет его указывать на следующий элемент списка.