Функциональные объекты
Класс, в котором определена операция вызова функции, называется функциональным. Объект функционального класса используется так, как если бы он был функцией. Функциональные объекты широко применяются в стандартной библиотеке С++. Чаще всего они используются в качестве параметров стандартных алгоритмов для задания пользовательских критериев сравнения объектов или способов их обработки.
Пример3для list
//ListChastota.cpp
#include <iostream>
#include <fstream>
#include <list>
#include <algorithm>
using namespace std;
//структура элемента списка
struct inf
{int num,q;};
//перегрузка операции <<
ostream& operator << (ostream& s, inf & x)
{s<<x.num<<" "<<x.q<<endl;
return s;}
// функциональный объект
class compare1
{public:
bool operator ()(inf a, inf b)const
{return a.num<b.num;
}
};
class compare2
{public:
bool operator ()(inf a, inf b)const
{return a.q<b.q;
}
};
Int main()
{ifstream fi("input.txt");
ofstream fo("output.txt");
compare1 u;
compare2 v;
list<inf> rez;
list<inf>::iterator it;
int k;
inf a;
while (fi>>k)
{it=rez.begin();
while(it!=rez.end() &&(*it).num!=k)
it++;
if(it!=rez.end())it->q++;
else {a.num=k;a.q=1; rez.push_back(a);}
}
fi.close();
for (it=rez.begin(); it!=rez.end(); it++)
fo<<*it<<" "; //Список до сортировки
fo<<endl;
//sort
rez.sort(u ); // сортировка с критерием u
for (it=rez.begin();it!=rez.end();it++)
fo<<*it< <” ”; //Список после сортировки
fo<<endl;
rez.sort(v); // сортировка с критерием v
for (it=rez.begin();it!=rez.end();it++)
fo<<*it<<” ”; //Список после сортировки частот
fo<<endl;
cout<<"end"<<endl;
fo.close();
return 0;
}
Input.Txt
5 1 3 5 2 1 5 6 3 2 2 7 5 3 5 7
output.txt
5 5 1 2 3 3 2 3 6 1 7 2
|
1 2 2 3 3 3 5 5 6 1 7 2
|
6 1 1 2 7 2 2 3 3 3 5 5
|
Адаптеры последовательных контейнеров
Это не новые типы контейнеров, а варианты имеющихся, их называют адаптерами контейнеров.
Стек – м.б. реализован на основе вектора, очереди или списка, в STL стек определён по умолчанию на базе двусторонней очереди. Метод занесения в стек – метод занесения в конец push_back, метод выборки – метод выборки из конца pop_back, добавлен метод top(). При работе со стеком нельзя пользоваться итераторами, нельзя получить значение элемента из середины стека, иначе , чем выбрав из стека все элементы, лежащие выше.
очередь - м.б. реализована на основе очереди или списка, в STL очередь определена по умолчанию на базе двусторонней очереди. Методы front и back используются для получения значений элементов, находящихся в начале и конце очереди (при этом элементы остаются в очереди)
очередь с приоритетами (priority_queue) м.б. реализована на основе очереди или вектора(они допускают произвольный доступ к элементам), в STL очередь определена по умолчанию на базе вектора. В очереди каждому элементу соответствует приоритет, определяющий порядок выборки из очереди. По умолчанию он определяется с помощью операции <, т.е. из очереди каждый раз выбирается максимальный элемент.