今天我写了一些关于使用std :: sort()来操作" vector"包含类对象的类型,但我在编码中发现了很多问题,请帮我找到解决方案:
#include <vector>
#include <algorithm>
class Obj{
private:
int m_;
public:
Obj():m_(0) {}
int act() { return m_; }
bool operator<(Obj obj) {
return this->act() < obj.act();
}
};
bool cmp(Obj a, Obj b)
{
return a.act() < b.act();
}
bool cmpA(const Obj& a, const Obj& b)
{
return a.act() < b.act(); // @1 but wrong!
}
int foo()
{
std::vector<Obj> vobj;
// ...
std::sort(vobj.begin(),vobj.end(),cmp); // @2 well, it's ok.
std::sort(vobj.begin(),vobj.end()); // @3 but wrong!
return 0;
}
@ 1:为什么param的类型必须是&#39; Obj&#39;而不是&#39; const Obj&amp;&#39 ;?但是当&#39; Obj&#39;是结构类型,它不会出错,为什么?
@ 3:我已经超载了运算符&#39;&lt;&#;;但是这里不能通过compling。我错过了什么吗? 请帮助我,谢谢!
答案 0 :(得分:4)
使用std::sort
时,您可以选择通过比较器,就像您一样。如果不这样做,std::sort
将使用std::less
作为比较器,std::less
默认使用operator<
。
您可以使用cmpA
仿函数,但只能访问传递对象的 const 成员函数 - 您在cmpA
中有对它们的const引用。< / p>
class Obj{
private:
int m_;
public:
Obj():m_(0) {}
int act() const { return m_; } // const member function, can be called on const objects or references
};
bool operator<(Obj const & L, Obj const & R) { // The operator takes const references - it can compare const objects
return L.act() < R.act();
}
使用此类和运算符,可以在不传递比较器的情况下调用std :: sort。
答案 1 :(得分:2)
int act() { return m_; }
应该是
int act() const { return m_; }
和
bool operator<(Obj obj) {
return this->act() < obj.act();
}
应该是
bool operator<(const Obj& obj) const {
return this->act() < obj.act();
}