【问题标题】:C++ sorting a vector of structsC ++对结构向量进行排序
【发布时间】:2018-09-27 09:14:29
【问题描述】:

我是 C++ 新手,正在尝试根据另一个向量中的值对向量进行排序。我试图通过创建结构向量并使用 STL 对结构向量进行排序来实现这一点。这些结构有 2 个数据项,一个是 CustomType,另一个是 int。我希望它按 int 字段的降序排序,因此包含一个布尔运算符重载以便能够使用 STL 排序(算法)。

使用对 CustomType 向量和最初未初始化的 int 向量的引用在函数中构造结构,并将它们组合成结构向量。整数的值是通过在 CustomType 向量的每个项目上调用 SomeClass (SomeFunc) 的单独成员函数和另一个 u_int8_t 参数来获得的(该函数本身可以正常工作)。

最后,我想根据排序后的结构序列替换排序后的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

我不明白为什么 bool 运算符重载是无效的,因为这是为结构的 int 字段定义的。

我错过了什么?任何帮助,将不胜感激。此外,任何有关更优雅的方法的建议也很好。

【问题讨论】:

标签: c++ sorting vector struct stl


【解决方案1】:

你需要重载 operator&lt; 而不是 operator&gt;

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

编辑:要按相反顺序排序,您需要使用rbegin()rend()(反向)迭代器调用std::sort

std::sort(xy_vec.rbegin(), xy_vec.rend()); 

编辑(再次,由于问题太长,有2个问题):

向量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 - 我不会告诉您所有这些。请找!

【讨论】:

  • 我提到我需要按降序排序。 > 运算符不是为此而重载吗?此外,重载
  • 我已经更新了答案。你的问题有很多文字,这就是我没有完整阅读的原因。您应该提出完整而简洁的问题。
  • 重载
  • 请阅读更新后的答案。并请提出好问题以获得好的回应!
【解决方案2】:

std::sort 有两个主要重载,一个没有排序谓词,默认使用operator &lt;,另一个有排序谓词(详细信息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>());

但我觉得直接使用 functor/lambda 比定义 operator&gt; 并使用 std::greater functor 更自然。

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多