stl — C ++ std: sort () с использованием разных критериев

Я много искал, и я не уверен, что этот запрос повторяется, но я использовал этот в качестве ссылки для создания сортировки для моего std::vector который принимает данные следующего типа.

typedef struct {
int size;
int type;
int id;
} AC;

Я был в состоянии написать отдельные функциональные объекты для каждого критерия.
Тем не менее, мое требование проекта говорит, что мне нужно иметь только один класс или структуру, чтобы включить все объекты функции для сортировки в соответствии с size,type а также id, Можно ли иметь все функциональные объекты для std::sort в одном классе?

Я имею в виду что-то вроде

Comparator com;
sort(iVec.begin(),iVec.end(),com.sortbysize);
sort(iVec.begin(),iVec.end(),com.sortbytype);
sort(iVec.begin(),iVec.end(),com.sortbyid);

Я также посмотрел на binary_functions чтобы выполнить мое требование, но я получал ошибки, когда я объявил более одного функционального объекта в одном классе.

Кроме того, необходимо ли, чтобы функциональные объекты std::sort (и в этом отношении любой алгоритм STL, который включает сравнение) должен быть bool operator() или они могут быть обычными функциями, возвращающими bool?

0

Решение

Да, обоим

struct Comparator
{
static bool sortbysize(const AC &lhs, const AC &rhs) { /*...*/ }
static bool sortbytype(const AC &lhs, const AC &rhs) { /*...*/ }
static bool sortbyid(const AC &lhs, const AC &rhs) { /*...*/ }
}
3

Другие решения

Да, если вы хотите иметь класс, вы можете определить для него статические функции:

class MyComparator {
public:
static bool sortbysize( const AC & elem1, const AC & elem2 ){ ... }
static bool sortbytype( const AC & elem1, const AC & elem2 ){ ... }
static bool sortbyid  ( const AC & elem1, const AC & elem2 ){ ... }
}

А затем с помощью сортировки с использованием соответствующего синтаксиса для вызова статических функций:

sort(iVec.begin(),iVec.end(),MyComparator::sortbysize);

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

typedef struct {
int size;
int type;
int id;

enum marker { SIZE, TYPE, ID };
static AC::marker comparisonType;

bool operator() (const AC & i,const AC & j)
{
// Work here to make the enum thing work with the switch-case...
// it's all about integers
switch(AC::comparisonType){
case SIZE:
return (i.size < j.size);
...
}
}
} AC;
1

По вопросам рекламы [email protected]