我是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字段定义的。
我错过了什么?任何帮助都将不胜感激。此外,任何关于更优雅的方法的建议都会很好。
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比定义
操作符更自然
您需要重载运算符
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语言数据结构之堆排序源代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言堆排序源代码,供大家参考,具体内容如下 1. 堆排序 堆排序的定义及思想可以参考百度百科: 用一句概括,堆排序就是一种改进的选择排序,改进的地方在于,每次做选择的时候,不单单把最大的数字选择出来,而且把排序过程中的一些操作进行了记录,这样在后续排序中可以