C ++对结构向量进行排序

时间:2018-09-27 09:14:29

标签: c++ sorting vector struct stl

我是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字段定义了布尔运算符重载的原因,我不明白。

我想念什么?任何帮助,将不胜感激。此外,关于以更优雅的方式实现此目的的任何建议也将很好。

2 个答案:

答案 0 :(得分:2)

您需要超载 operator< 而不是operator>

bool operator<(const CustomStruct& a) const
{
    return (this->var2 < a.var2);
}

编辑:要以相反的顺序进行排序,您需要使用std::sortrbegin()(反向)迭代器来调用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仿函数更为自然。