Пример использования стандартного алгоритма sort. Предикаты

Страницы работы

Содержание работы

Пример использования стандартного алгоритма 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

}

Похожие материалы

Информация о работе