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

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

313

q.frontO

54

q.backO

q.front 0

0

q.backO

q.frontO

76

q.backO

q.frontO

23

q.backO

q.frontO

51

q.backO

q.frontO

11

q.backO

q.frontO

51

q.backO

q.frontO

11

q.backO

q.frontO

76

q.backO

q.frontO

88

q.backO

q.frontO

0

q.backO

0

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

Очереди с приоритетами (priority_queue)

В очереди с приоритетами каждому элементу соответствует приоритет, определяющий порядок выборки из очереди. По умолчанию он определяется с помощью операции <; таким образом, из очереди каждый раз выбирается максимальный элемент.

Для реализации очереди с приоритетами подходит контейнер, допускающий произвольный доступ к элементам, то есть, например, вектор или двусторонняя очередь. Тип контейнера передается вторым параметром шаблона (первый, как обычно, тип элементов). Третьим параметром указывается функция или функциональный объект (см. с. 195 и 334), с помощью которых выполняется определение приоритета:

template <class Т. class Container = vector<T>,

class Compare = less<typename Container::value_type> > class priority_queue { protected: Container c; Compare comp; public:

explicit priority_queue(const Compare& x = CompareO.

const Contained = ContainerO); template <class Inputlter>

priority_queue(lnputlter first, Inputlter last,

const Compare& x = CompareO, const Contained = ContainerO): bool empty О const {return c.emptyO:}

size_typesize() const {return c.sizeO:}

const value_type& topO const {return c.frontO;} void push(const value_type& x); void popO:

Для элементов с равными приоритетами очередь с приоритетами является простой очередью. Как и для стеков, основными методами являются push, pop и top.

314

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

Простой пример:

#include <iostream> #include <vector> #include <functional> #include <queue> using namespace std; int main(){

priority_queue <int. vector<int>, less<int> > P;

int x;

P.push(13); P.push(51); P.push(200); P.push(17);

while (!P.empty()){

x = P.topO; cout « "Выбран элемент: " « x « end!: P.popO:

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

Выбран элемент: 200

Выбран элемент: 51

Выбран элемент: 17

Выбран элемент: 13

В этом примере третьим параметром шаблона является шаблон, определенный в заголовочном файле functional> (см. раздел «Функциональные объекты», с. 334). Он задает операцию сравнения на «меньше». Можно задать стандартные шаблоны greater<™n>, greater_equal<™n>, less_equal<™n>. Если требуется определить другой порядок выборки из очереди, вводится собственный функциональный объект. В приведенном ниже примере выборка выполняется по наименьшей сумме цифр в числе:

#include <iostream>

#include <vector>

#include functional>

#include <queue>

using namespace std:

class CompareSum{

public:

bool operator()(int x, int y){

int sx = 0. sy = 0:

while (x){sx += x % 10: x /= 10:}

while (y){sy += у % 10: y/-10;}

return sx > sy :

}

}:■

int main(){

priority_queue <int. vector<int>, CompareSum > P;

int x:

P.push(13); P.push(51): P.push(200); P.push(17):

while (!P.empty()){