Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 12. Контейнерные классы

309

Вторая форма метода unique использует в качестве параметра бинарный предикат (см. с. 336), что позволяет задать собственный критерий удаления элементов списка. Предикат имеет значение true, если критерий соблюден, и false — в противном случае. Аргументы предиката имеют тип элементов списка:

template <class BinaryPredicate>

void unique(BinaryPredicate binary_pred);

Для слияния списков служит метод merge:

void mergedist<T>& x);

template <class Compare> void merge(list<T>& x, Compare comp);

Оба списка должны быть упорядочены (в первом случае в соответствии с определением операции < для элементов, во втором — в соответствии с функциональным объектом Compare). Результат — упорядоченный список. Если элементы в вызывающем списке и в списке-параметре совпадают, первыми будут располагаться элементы из вызывающего списка.

Метод reverse служит для изменения порядка следования элементов списка на обратный (время работы пропорционально количеству элементов):

void reversed;

Пример работы со списком:

#include <fstream>

#include <list>

using namespace std;

void show (const char *str, const list<int> &L){

cout « str « ":" « endl;

for dist<int>: :const_iterator i = L.beginO; i != L.endd: ++i) cout « *i « " ";

cout « endl;

}

int maind{ list<int> L: list<int>: iterator i; int x;

ifstream indinpnum"); while ( in » x, lin.eofO) L.push_back(x); show("Исходный список", L); L.pushJrontQ);

i = L.beginO: L.insert(++i. 2); show("После вставки 1 и 2 в начало", L); i = L.endd: L.insert(--i, 100): show("После вставки 100 перед последним", L): i = L.beginO: x = *i: L.pop_frontd: cout « "Удалили из начала" « х « endl: i = L.endd: x = *--i; L.pop_backd: cout « "Удалили с конца" « x « endl: showd'CnncoK после удаления". L); L.remove(76):

310

Часть III. Стандартная библиотека

show("После удаления элементов со значением 76". L);-

L.sortO:

show("После сортировки", L);

L.uniqueO;

show("После unique", L);

list<int> LI (L);

L.reverseO;

show("После reverse", L);

}

Результат работы программы:

Исходный список:

56 34 54 0 76 23 51 11 51 11 76 88

После вставки 1 и 2 в начало:

1 2 56 34 54 0 76 23 51 11 51 11 76 88

После вставки 100 перед последним:

1 2 56 34 54 0 76 23 51 11 51 11 76 100 88 Удалили из начала 1

Удалили с конца 88 Список после удаления:

2 56 34 54 0 76 23 51 11 51 11 76 100 После удаления элементов со значением 76: 2 56 34 54 0 23 51 11 51 11 100

После сортировки:

0 2 11 11 23 34 51 51 54 56 100

После unique:

0 2 11 23 34 51 54 56 100

После reverse:

100 56 54 51 34 23 11 2 0

К спискам можно применять алгоритмы стандартной библиотеки, описанные в разделе «Алгоритмы» (с. 343).

Стеки (stack)

Как известно, в стеке (определение см. раздел «Стеки», с. 119) допускаются только две операции, изменяющие его размер — добавление элемента в вершину стека и выборка из вершины. Стек можно реализовать на основе любого из рассмотренных контейнеров: вектора, двусторонней очереди или списка. Таким образом, стек является не новым типом контейнера, а вариантом имеющихся, поэтому он называется адаптером контейнера. Другие адаптеры (очереди и очереди с приоритетами) будут рассмотрены в следующих разделах.

В STL стек определен по умолчанию на базе двусторонней очереди:

template <class T, class Container = deque<T> > class stack { protected: Container c: