我是C ++的新手,正在尝试根据另一个向量中的值对向量排序。我正在尝试通过创建结构向量并使用STL对结构向量进行排序来实现这一点。这些结构具有2个数据项,一个为CustomType,另一个为int。我希望按int字段的降序进行排序,因此包括一个布尔运算符重载,以便能够使用STL排序(算法)。
在函数中使用对CustomType向量和最初未初始化的int向量的引用构造该结构,并将它们组合为结构的向量。通过在CustomType向量的每一项上调用SomeClass(SomeFunc)的单独成员函数以及另一个u_int8_t参数(此函数本身可以正常工作)来获取int的值。
最后,我要根据已排序的结构序列替换已排序的CustomType对象。
实现文件(.cpp)具有以下功能:
void SomeClass::orderFunc(std::vector<CustomType>& x, std::vector<int>& y, u_int8_t param){
std::vector<CustomStruct> xy_vec;
y.assign(x.size(), 0);
int count = int(x.size());
for(int i=0; i != count; ++i){
y[i] = SomeFunc(x[i], param);
}
for(int i = 0; i != count; ++i){
xy_vec[i].var1 = x[i];
xy_vec[i].var2 = y[i];
}
std::sort(xy_vec.begin(), xy_vec.end());
for(int i = 0; i != count; ++i){
x[i] = xy_vec[i].var2;
}
}
该结构在SomeClass头文件中定义如下:
struct CustomStruct{
CustomType var1;
int var2;
bool operator>(const CustomStruct& a) const{
return (this->var2 > a.var2);
}
};
调用此函数时,出现以下错误:
对二进制表达式无效的操作数
bool operator()(const _T1&__x,const _T1&__y)const {return __x <__y;}
鉴于为struct的int字段定义了布尔运算符重载的原因,我不明白。
我想念什么?任何帮助,将不胜感激。此外,关于以更优雅的方式实现此目的的任何建议也将很好。
答案 0 :(得分:2)
您需要超载 operator<
而不是operator>
bool operator<(const CustomStruct& a) const
{
return (this->var2 < a.var2);
}
编辑:要以相反的顺序进行排序,您需要使用std::sort
和rbegin()
(反向)迭代器来调用rend()
:
std::sort(xy_vec.rbegin(), xy_vec.rend());
编辑(同样,由于问题太长,有两个问题):
向量xy_vec
为空,您需要调用resize
:
std::vector<CustomStruct> xy_vec;
// Resize here
xy_vec.resize(count);
for(int i = 0; i != count; ++i){
xy_vec[i].var1 = x[i];
xy_vec[i].var2 = y[i];
或者您可以致电push_back
-我并不是全部告诉您。请找到!
答案 1 :(得分:2)
std::sort
有两个主要重载,一个没有默认使用operator <
的排序谓词,另一个没有排序谓词(详细信息here)。
所以您可以写类似
struct CustomStructCmp {
bool operator()(const CustomStruct& a, const CustomStruct& b) const
{
return a.var2 > b.var2;
}
};
std::sort(xy_vec.begin(), xy_vec.end(), CustomStructCmp());
(如果您使用的是C ++ 11,则可以改用lambda)。
或者您可以写
std::sort(xy_vec.begin(), xy_vec.end(), std::greater<CustomStruct>());
但是我觉得直接使用仿函数/ lambda比定义operator>
和使用std::greater
仿函数更为自然。