当前位置: 首页 > 知识库问答 >
问题:

C排序结构向量

易俊远
2023-03-14

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

在函数中使用对CustomType向量和初始未初始化的int向量的引用构造结构,并将它们组合成结构向量。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操作符重载是无效的,因为它是为结构的int字段定义的。

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

共有2个答案

颜实
2023-03-14

std::sort有两个主要重载,一个重载没有默认使用运算符的排序谓词

所以你可以写一些

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());

(如果您使用的是C11,那么您可以使用lambda)。

或者你可以写

std::sort(xy_vec.begin(), xy_vec.end(), std::greater<CustomStruct>());

但我觉得直接使用functor/lambda比定义操作符更自然

阎令
2023-03-14

您需要重载运算符

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

编辑:对于逆序排序,您需要调用std::排序rstart()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-我不会告诉您所有这些。请查找!

 类似资料:
  • 本文向大家介绍C++ 数据结构 堆排序的实现,包括了C++ 数据结构 堆排序的实现的使用技巧和注意事项,需要的朋友参考一下 堆排序(heapsort)是一种比较快速的排序方式,它的时间复杂度为O(nlgn),并且堆排序具有空间原址性,任何时候只需要有限的空间来存储临时数据。我将用c++实现一个堆来简单分析一下。 堆排序的基本思想为: 1、升序排列,保持大堆;降序排列,保持小堆; 2、建立堆之后,将

  • 主要内容:C#程序结构,编译并执行程序在讲解 C# 的基本语法之前,让我们先来了解一下一个简单的 C# 程序是由哪些部分构成的。一个 C# 程序主要包括以下几个部分: 命名空间声明; 一个类(class); 类方法; 类属性; 一个 Main 方法; 语句和表达式; 注释。 C#程序结构 下面我们通过一个在命令行窗口打印“Hello World”的示例程序,来具体演示一下 C# 程序的组成,代码如下: 运行上面的代码即可在命令行窗口输

  • 我有以下向量: 现在我想按奇指数对向量进行字典排序(如果奇指数相等,则按偶数指数)。使得排序向量“vec”为: 我知道d::排序将完全排序“vec”。是否可以使用d::排序来选择性地对向量进行排序。d::lower_bound类似。是否可以仅使用奇数索引来查找lower_bound。 我想要与对向量相同的效果。出于效率原因,我不将vec存储为对向量。

  • 主要内容:1. Objective-C Hello World示例在学习Objective-C编程语言的基本构建块之前,先来看一下最基本的Objective-C程序结构,以便在接下来的章节中,将它作为参考理解程序。 1. Objective-C Hello World示例 Objective-C程序基本上由以下部分组成 - 预处理程序命令 接口 实现 方法 变量 声明和表达 注释 下面来看一下打印“Hello World”字样的简单代码 - 下面对上述程序的各个

  • 本文向大家介绍C语言 数据结构堆排序顺序存储(升序),包括了C语言 数据结构堆排序顺序存储(升序)的使用技巧和注意事项,需要的朋友参考一下 堆排序顺序存储(升序) 一: 完全二叉树的概念:前h-1层为满二叉树,最后一层连续缺失右结点! 二:首先堆是一棵全完二叉树: a:构建一个堆分为两步:⑴创建一棵完全二叉树      ⑵调整为一个堆 (标注:大根堆为升序,小根堆为降序)    b:算法描述:①创

  • 在我们学习 C# 编程语言的基础构件块之前,让我们先看一下 C# 的最小的程序结构, 以便作为接下来章节的参考。 创建 Hello World 实例 一个 C# 程序主要包括以下部分: 命名空间声明 一个类 类方法 类属性 一个 Main 方法 语句和表达式 注释 让我们看一个可以打印出 “Hello World” 的简单的代码: using System; namespace HelloWorl