如何对包含类对象的“vector”进行排序?为什么我错了?

时间:2011-03-17 17:03:57

标签: c++ stl

今天我写了一些关于使用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。我错过了什么吗? 请帮助我,谢谢!

2 个答案:

答案 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();
}