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

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

311

public:

explicit stack(const Containers = ContainerO);

boo! empty О const {return c.emptyO;}

size_type sizeO const {return c.sizeO;}

value_type& top() {return c.backO:}

const value_type& top() const {return c.backO;}

void push(const value_type& x) {c.pushjback(x):}

void pop О {c.pop_back();}

}: Из приведенного описания (оно дано с сокращениями) видно, что метод занесения в стек push соответствует методу занесения в конец push_back, метод выборки из стека pop — методу выборки с конца pop__back, кроме того, добавлен метод top для получения или изменения значения элемента на вершине стека. Конструктору класса stack передается в качестве параметра ссылка на базовый контейнер, который копируется в защищенное поле данных с.

При работе со стеком нельзя пользоваться итераторами и нельзя получить значение элемента из середины стека иначе, чем выбрав из него все элементы, лежащие выше. Для стека, как и для всех рассмотренных выше контейнеров, определены операции сравнения (см. 303).

Пример использования стека (программа вводит из файла числа и выводит их на экран в обратном порядке):

#include <fstream> #include <vector> #include <stack> using namespace std: int main(){

ifstream in ("inpnum"):

stack <int. vector<int> > s;

int x:

while ( in » x, Mn.eofO) s.push(x):

while (! s.empty()){

x - s.topO; cout « x « " ": s.popO: } } Содержимое файла i npnum:

56 34 54 0 76 23 51 11 51 11 76 88 Результат работы программы:

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

Очереди (queue)

Для очереди (определение см. раздел «Очереди», с. 121) допускаются две операции, изменяющие ее размер — добавление элемента в конец и выборка из начала. Очередь является адаптером, который можно реализовать на основе двусторон-

312

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

ней очереди или списка (вектор не подходит, поскольку в нем нет операции выборки из начала).

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

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

Container c; public:

explicit queue(const Containers = ContainerO): bool empty О const {return c.emptyO;}

size_type sizeO const {return c.sizeO:}

value_type& front О {return c.frontO:}

const value_type& front О const {return c.frontO:} value_type& back О {return c.backO:}

const value_type& backO const {return c.backO;} void push(const value_type& x) {c.push_back(x):} void pop() {c.pop_front():}

}: Методы front и back используются для получения значений элементов, находящихся соответственно в начале и в конце очереди (при этом элементы остаются в очереди).

Пример работы с очередью (программа вводит из файла числа в очередь и выполняет выборку из нее, пока очередь не опустеет):

#include <fstream> #include <list> #include <queue> using namespace std: int main(){

ifstream in ("inpnum"): queue <int. list<int> > q: int x:

while ( in » x. Mn.eofO) q.push(x): cout « "q.frontO: " « q. front О « " ": cout « "q.backO: " « q.backO « endl: while (! q.empty()){ q.popO:

cout « "q.frontO: " « q.frontO « " ": cout « "q.backO: " « q.backO « endl; } } Содержимое файла inpnum:

56 34 54 0 76 23 51 11 51 11 76 88 Результат работы программы:

q.frontO: 56 q.backO: 88 q.frontO: 34 q.backO: 88