C++自定义结构体的排序规则详解
创作时间:
作者:
@小白创作中心
C++自定义结构体的排序规则详解
引用
CSDN
1.
https://m.blog.csdn.net/m0_62128476/article/details/145293176
本文将详细介绍C++中自定义结构体的排序规则。通过重载小于号运算符和编写比较函数两种方法,你可以灵活地定义结构体的排序逻辑。此外,文章还将讨论在使用priority_queue和set等容器存储结构体时可能遇到的问题,帮助你避免常见的陷阱。
1. 准备工作
假设现在有一个名为 node
的结构体:
struct node {
int x;
int y;
};
2. 通过重载小于号来自定义结构体的排序规则
通过重载小于号运算符,可以自定义结构体的排序规则。例如,我们可以按照 x
的升序排序,如果 x
相同,则按照 y
的升序排序:
struct node {
int x;
int y;
bool operator<(const node &anotherNode) const {
if (x != anotherNode.x) {
return x < anotherNode.x;
}
return y < anotherNode.y;
}
};
重载运算符后,就可以通过 sort
函数直接对结构体数组排序了:
node nodes[N];
for (int i = 0; i < N; i++) {
nodes[i].x = i;
nodes[i].y = N - i;
}
sort(nodes, nodes + N);
3. 通过编写比较函数来自定义结构体的排序规则
如果结构体重载了小于号,但 sort
函数又指定了比较函数,则以比较函数中的排序规则为准。例如:
bool sortByXAscAndYAsc(const node &front, const node &back) {
if (front.x != back.x) {
return front.x < back.x;
}
return front.y < back.y;
}
将函数名作为第三个参数传递给 sort
函数,就可以通过 sort
函数直接对结构体数组排序了:
node nodes[N];
for (int i = 0; i < N; i++) {
nodes[i].x = i;
nodes[i].y = N - i;
}
sort(nodes, nodes + N, sortByXAscAndYAsc);
4. 在使用priority_queue和set等容器存储结构体时可能遇到的问题
如果结构体在重载小于号时函数没有添加 const
关键字,但又使用了 priority_queue
和 set
等容器存储结构体,编译器会给出以下错误:
错误信息显示:
In template: invalid operands to binary expression (‘const node’ and ‘const node’)
error occurred here in instantiation of member function ‘std::less::operator()’
requested here in instantiation of member function ‘std::_Rb_tree<node, node, std::_Identity, std::less>::_M_get_insert_unique_pos’
requested here in instantiation of function template specialization ‘std::_Rb_tree<node, node, std::_Identity, std::less>::_M_insert_unique’
requested here in instantiation of member function ‘std::set::insert’
requested here
candidate template ignored: could not match ‘const reverse_iterator<_Iterator>’ against ‘const node’
candidate template ignored: could not match ‘const reverse_iterator<_IteratorL>’ against ‘const node’
candidate template ignored: could not match ‘const move_iterator<_IteratorL>’ against ‘const node’
candidate template ignored: could not match ‘const move_iterator<_Iterator>’ against ‘const node’
candidate function not viable: ‘this’ argument has type ‘const node’, but method is not marked const
这个错误的原因是结构体的重载小于号函数没有添加 const
关键字。在C++中,const
关键字用于指定一个变量、对象的属性或成员函数不会改变。当一个函数被 const
关键字修饰时,该函数被称为常函数,常函数不能修改对象的属性(每个结构体的实例都可以看做是一个对象)。
试想一下,如果重载小于号的函数没有使用 const
关键字修饰,那么函数内就可以修改结构体中某个变量的值。这也是为什么在使用 priority_queue
、set
等容器存储结构体变量时,结构体必须已经实现了用 const
修饰的重载小于号的函数。因为一旦在重载小于号的函数修改了结构体中某个变量的值,就有可能导致排序结果是错误的。
热门推荐
南宋为何多权相?从“委托制”到“枢机制”的历史逻辑
买带鱼时,要是碰到这3种带鱼,转身走就对了!有的含二级有毒物
单位开具无犯罪记录证明需要什么材料?有效期是多久?
“刷机”行为的性质认定及法律规制
霍尔效应及霍尔传感器
农村高发案件解析:预防及应对策略
中国文化中的“鹿”:考古发现改写认知,难怪古人说“逐鹿天下”
北京化工大学“春晖文化探究队”返乡社会实践:以青春之力,守护春节文化根脉
地图制图学与地理信息系统:探索空间数据的集成与应用
酒店装修设计材料选择:关键要素与策略解析
辛集工伤鉴定必读指南:类型、流程与结果应用详解
山东大学,在下一盘大棋
科技赋能乡村振兴:战略意义、挑战与应对策略深度解析
十大经典益智游戏推荐
保健品诈骗案件:法律解读与社会影响分析
跳街舞如何训练力量
苹果期货价格持续下跌的原因是什么?这种下跌趋势会带来哪些后果?
经典方剂小柴胡汤只能用来治感冒?未免太小看它了!
材料类哪个专业就业前景好:材料类最吃香的三个专业盘点
MBTI中的P人:感知型性格特征全解析
在职MBA值得投资吗?从多角度分析
从盐碱荒滩到开放窗口——天津滨海新区打造多层次开发开放新格局
怀孕可以养猫吗?了解孕期养猫3个重点
树莓派能用来干什么
2025-2030年全球及中国摩托车行业现状及前景分析
职场人际:新旧世代各有所长,这样做有助创造双赢
国企员工患抑郁症怎么办
从怪异迷的角度评价宝可梦设计:榛果球家族
一招修复机械硬盘无法识别,硬盘无法识别需要初始化
中国地质大学(武汉)专业设置及重点特色专业一览