Пример использования стандартного алгоритма sort. Предикаты.
template<class RanIt>
void sort(RanIt first, RanIt last);//сортирует указанную итераторами [first, last)последовательность используя operator< (то есть X < Y). Таким образом, последовательность оказывается упорядоченной в возрастающем порядке.
template<class RanIt, class Pred>
void sort(RanIt first, RanIt last, Pred pr);//сортирует указанную последовательность, используя вместо operator<(X, Y) функцию-предикат pr(X, Y).
1) без предиката:
{
int ar[] = {5,10,2,-1,33,2};
sort(ar,ar+sizeof(ar)/sizeof(int));//в возрастающем
}
2) //1) функция
bool cmp1(int x, int y){return x>y;}
void main()
{
int ar[] = {5,10,2,-1,33,2}; //с предикатом – в убывающем
sort(ar,ar+sizeof(ar)/sizeof(ar[0]), cmp1);
}
3) шаблон функции
//Предикаты. В качестве параметра алгоритма стандартной библиотеки:
//0) без предиката:
//1) функция
bool cmp1(int x, int y){return x>y;}
//2) шаблон функции
template<typename T> bool cmp2(T x, T y){return x>y;}//ошибка при указании имени такой функции в качестве аргумента другой функции (sort)
//3) функциеподобный объект
class cmp3{//для int
public:
bool operator()(int x, int y) const
{return x>y;}
};
class cmp3P{//для Point
public:
bool operator()(Point x, Point y) const
{return x>y;}
};
//4) шаблон класса
template<class T> class cmp4{//для int
public:
bool operator()(T x, T y) const
{return x>y;}
};
//5) unary_function(< functional >)
/*template<class _A, class _R>
struct unary_function
{
typedef _A argument_type;
typedef _R result_type;
};
*/
class cmp5: public unary_function<Point,bool>{
Point m_point;
public:
cmp5(const Point& ref):m_point(ref){}
bool operator() (Point& r) {return m_point==r;}//m_point<r
};
//////////////////////////
void main()
{
{
//////////////////
//Предикаты. В качестве параметра алгоритма стандартной библиотеки:
//0)
{
int ar[] = {5,10,2,-1,33,2};
sort(ar,ar+sizeof(ar)/sizeof(ar[0]));
stop
Point arPoints[] = {Point(33,44), Point(5,6), Point(20,20)};
sort(arPoints, arPoints+sizeof(arPoints)/sizeof(arPoints[0]));
stop
}
//1) функция
{
int ar[] = {5,10,2,-1,33,2};
sort(ar,ar+sizeof(ar)/sizeof(int), cmp1);
}
//2) шаблон функции -
{
int ar[] = {5,10,2,-1,33,2};
Point arPoints[] = {Point(33,44), Point(5,6), Point(20,20)};
cmp2(arPoints[0],arPoints[0]);//**
sort(arPoints,arPoints+sizeof(arPoints)/sizeof(arPoints[0]),cmp2<Point>);
// sort(ar,ar+sizeof(ar)/sizeof(ar[0]),cmp2<int>);//unresolved external symbol "bool __cdecl cmp2(int,int)
//1) если просто cmp2 - ошибка, так как компилятор не может догадаться - для какого типа аргументов генерировать тело! (не знает тип аргумента шаблона для того, чтобы сгенерировать тело)
//cannot use function template 'bool __cdecl cmp2(T,T)' as a function argument
//2) cmp2<Point> без строки ** знает тип, но не генерирует тело
//3) если тело для данного типа уже сгенерировано - все OK
stop
}
//3) функциеподобный объект
{
int ar[] = {5,10,2,-1,33,2};
sort(ar,ar+sizeof(ar)/sizeof(int), cmp3());
stop
Point arPoints[] = {Point(33,44), Point(5,6), Point(20,20)};
sort(arPoints,arPoints+sizeof(arPoints)/sizeof(arPoints[0]),cmp3P());//
//конструируется объект типа cmp3 и вызывается operator()
stop
}
//4) шаблон
{
int ar[] = {5,10,2,-1,33,2};
sort(ar,ar+sizeof(ar)/sizeof(int), cmp4<int>());
stop
Point arPoints[] = {Point(33,44), Point(5,6), Point(20,20)};
sort(arPoints,arPoints+sizeof(arPoints)/sizeof(arPoints[0]),cmp4<Point>());//
//конструируется объект типа cmp3 и вызывается operator()
stop
}
//5) unary_function, binary_function
{
Point arPoints[] = {Point(20,20),Point(33,44), Point(5,6), Point(20,20),Point(20,20)};
//// sort(arPoints,arPoints+sizeof(arPoints)/sizeof(arPoints[0]),cmp5(Point(20,20)));//
int n=count_if(arPoints,arPoints+sizeof(arPoints)/sizeof(arPoints[0]),cmp5(Point(20,20)));//
//конструируется объект типа cmp3 и вызывается operator()
stop
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.