为什么stl比较函数不是成员?

时间:2009-07-30 23:54:46

标签: c++ stl comparison name-decoration

只是好奇好奇为什么stl :: sort的compare函数不能成为静态成员?

我有一个在头文件中声明和定义的小辅助类foo,但现在我必须为cmp()的实现创建一个foo.cpp文件,因此它不是多次定义的。

我还必须考虑一个适当装饰的名称,这样fooCmp()不会与任何其他cmp()冲突。

因为它无法访问任何成员变量,所以任何需要访问其他值的比较操作(例如,与foo.bar的距离排序)都需要复杂的bind2nd调用。

3 个答案:

答案 0 :(得分:3)

我不确定你在抱怨什么:

std::sort(begin,end)        // use operator<
std::sort(begin,end,order)  // Where order is a functor

顺序可以是:

  • 功能
  • 静态成员函数
  • 或者行为类似于函数的对象。

以下适用于我:

class X
{
    public: static bool diff(X const& lhs,X const& rhs) { return true;}
};

int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end(),&X::diff);
}

但是如果这个类有一些自然的顺序那么为什么不定义运算符&lt;为了上课。这将允许您访问成员,并且对于需要定义排序的大多数标准容器/算法将表现良好。

class X
{
    public: bool operator<(X const& rhs) const   {  return true;}
};
int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end());
}

答案 1 :(得分:0)

如果您关注多重定义的比较函数,请尝试使用static链接声明该函数。然后,函数的范围不会超出找到它的编译单元。

那就是说,你的比较“函数”根本不需要是一个函数,而是一个函数 object 。函数对象非常类似于函数,但实现为operator(),它在常规类中获取适当的参数。由于它是常规类,因此可以将构造函数参数传递给类。

这是一个简单的例子:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class comparator {
public:
    bool operator()(int a, int b) {
        return a < b;
    }
};

int main(int, char *[])
{
    vector<int> a;
    a.push_back(1);
    a.push_back(3);
    a.push_back(2);
    sort(a.begin(), a.end(), comparator());
    cout << a << endl;
}

答案 2 :(得分:0)

实际上听起来像是功能 在课堂上宣布, 在标题中定义但在类之外没有内联链接

即:

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 

而不是

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
inline bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 

第一个将导致在每个编译单元

中定义函数
#includes "foo.h"