我已经定义了一个类
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);
时。 R
是Rent
类型的向量,n
是整数(向量的大小)。
除此之外,我尝试了这两种方法,但仍然失败了!
sort(R, R + sizeof(R)/sizeof(R[0]));
sort(R.begin(), R.end());
我用谷歌搜索并获得了一些lambda的解决方案,但是sort()的第二个参数是int + custom_datatype类型。
任何帮助都会很棒。
答案 0 :(得分:4)
sort(R, R+n);
sort(R, R + sizeof(R)/sizeof(R[0]));
如果R
的类型为std::vector<Rent>
,将无效。这些行有两个问题:
operator+()
未定义为std::vector
。operator<()
函数是const
成员函数。您可以通过将其设为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)
根据错误,R
是std::vector<Rent>
,但代码如下:
sort(R, R+n);
仅适用于C样式数组。如果您想要适用于C数组和std::vector
的通用代码,请将其写为:
std::sort( std::begin(R), std::end(R) );