0

我搜索了很多,我不确定这是否是重复的查询,但我用作为参考来为我创建一个排序,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

4

2 回答 2

4

两者都是:

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) { /*...*/ }
}
于 2012-10-18T23:37:00.573 回答
1

是的,如果你想拥有一个类,你可以在它上面定义静态函数:

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 来调用静态函数:

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; 
于 2012-10-18T23:39:32.160 回答