c ++在向量中排序自定义对象

时间:2014-08-06 09:22:18

标签: c++ sorting vector

stackoverflow上的许多主题已经解决了这个问题,但是我无法为我的例子做好准备。 我有一个类事件,有事件发生的时间。 我想根据那个时间在向量中对这些对象进行排序。

我首先开始实现运算符<,但编译器发出以下错误:

  

错误1错误C2582:'event''函数在'事件'中不可用c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ algorithm 3009 1排序

然后我添加了operator =

以下是我使用的代码:

#include <algorithm>    // std::sort
#include <vector>       // std::vector

using namespace std;

class Event{
public:
     const double time;
     Event(double);
     bool operator<(const Event&);
     bool operator=(const Event&);
};

Event::Event(double time) :
time(time){

}

bool Event::operator<(const Event& rhs)
{
    return this->time < rhs.time;
}

bool Event::operator=(const Event& rhs)
{
    return this->time == rhs.time;
}

int main() {
    vector<Event> vector;
    Event e1 = Event(10);
    Event e2 = Event(5);
    Event e3 = Event(7);
    vector.push_back(e1);
    vector.push_back(e2);
    vector.push_back(e3);
    sort(vector.begin(), vector.end());
    return 0;
}

当我调试时,我注意到我的对象根本没有排序。 它们按我添加的顺序排列。 以下是'vector'变量的摘录:

[0] {time=10.000000000000000 }  Event
[1] {time=5.0000000000000000 }  Event
[2] {time=7.0000000000000000 }  Event

我有以下问题:

  1. 当我调用sort时,为什么我的事件没有在向量中排序?
  2. 为什么sort需要operator =?

3 个答案:

答案 0 :(得分:2)

问题是由于Event成员,无法分配您的班级const double time的对象。由于成员是const,因此无法对其进行修改,因此您无法在具有sort个对象的容器上使用Event,因为排序需要分配。

删除const或重新考虑您尝试执行的操作。顺便说一句,你是混淆赋值运算符(operator=,这是sort需要) with equality operator (运算符==`)。

答案 1 :(得分:2)

要对向量内的对象重新排序,对象必须是可复制的(或可移动的)。您必须定义一个operator =(这是一个赋值),其格式为:

Event& operator=(const Event& other) 
{
    if(&other != this) { this->time = other.time; }
    return *this;
}

所以你的operator =的实现是错误的。您正在比较两个对象,但这不是operator =(赋值!)应该做的。它必须将一个对象(其内容)分配给另一个对象,并返回对分配给的对象的引用。 请记住,如果实现赋值运算符,则应提供复制构造函数。

答案 2 :(得分:1)

这是问题的自定义赋值运算符的正确实现:

Event& Event::operator=(const Event& other) 
{
    if(&other != this) {
        // As time is const, we modify it through a secondary reference
        // you can say it cheating with the compiler
        double &rTime = (double&) this->time;
        rTime = other.time;      // this modifies this->time variable
    }
    return *this;
}

此外,还更改赋值运算符的声明:

class Event{
public:
     Event& operator=(const Event&);
     // other declarations...
};