不匹配'运营商+'在c ++中排序

时间:2016-01-05 04:25:40

标签: c++ sorting stl

我已经定义了一个类

class Rent
{
    public:    
    int s_time, duration, price, e_time;
    Rent(int s, int d, int p)
    {
        s_time = s;
        duration = d;
        price = p;
        e_time = s + d;
    }
    bool operator<(Rent const &r1)
    {
        return e_time < r1.e_time;
    }
};

希望根据e_time对其进行排序,因此我已将<定义为Rent,但是,我一直收到错误

rent.cpp:38:12: error: no match for ‘operator+’ (operand types are ‘std::vector<Rent>’ and ‘int’)

     sort(R, R+n);
              ^

当我尝试sort(R, R+n);时。 RRent类型的向量,n是整数(向量的大小)。

除此之外,我尝试了这两种方法,但仍然失败了!

sort(R, R + sizeof(R)/sizeof(R[0]));
sort(R.begin(), R.end());

我用谷歌搜索并获得了一些lambda的解决方案,但是sort()的第二个参数是int + custom_datatype类型。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:4)

sort(R, R+n);
sort(R, R + sizeof(R)/sizeof(R[0]));
如果R的类型为std::vector<Rent>

将无效。这些行有两个问题:

  1. operator+()未定义为std::vector
  2. 编译器期望operator<()函数是const成员函数。
  3. 您可以通过将其设为operator<()成员函数来修复const函数。

    bool operator<(Rent const &r1) const
                               //  ^^^^^
    {
        return e_time < r1.e_time;
    }
    

    这仍然无法解决第一个问题。

    但是你应该可以使用:

    sort(R.begin(), R.end());
    

    之后。

    理论上,您不应该使operator<()函数成为非const成员函数。看看http://en.cppreference.com/w/cpp/algorithm/sort。请参阅comp参数的说明。它说:

      

    比较函数的签名应等同于以下内容:

    bool cmp(const Type1 &a, const Type2 &b);
    
         

    签名不需要const &,但函数对象不得修改传递给它的对象。

    然而,并非所有编译器都坚持这一点。他们希望函数的签名能够与const个对象一起使用。

答案 1 :(得分:2)

根据错误,Rstd::vector<Rent>,但代码如下:

sort(R, R+n);

仅适用于C样式数组。如果您想要适用于C数组和std::vector的通用代码,请将其写为:

std::sort( std::begin(R), std::end(R) );