只是好奇好奇为什么stl :: sort的compare函数不能成为静态成员?
我有一个在头文件中声明和定义的小辅助类foo,但现在我必须为cmp()的实现创建一个foo.cpp文件,因此它不是多次定义的。
我还必须考虑一个适当装饰的名称,这样fooCmp()不会与任何其他cmp()冲突。
因为它无法访问任何成员变量,所以任何需要访问其他值的比较操作(例如,与foo.bar的距离排序)都需要复杂的bind2nd调用。
答案 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"