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
修饰的重载小于号的函数。因为一旦在重载小于号的函数修改了结构体中某个变量的值,就有可能导致排序结果是错误的。
热门推荐
如何解决Go模块下载缓慢或失败的问题
2025家校信息沟通平台建设计划
购房者必看:超高得房率的真相
多地出新规,减少公摊面积,提升得房率!杭州 “神户型”会重出江湖么?
杭州古建筑设计,探寻设计精髓,领略文化之美
江南传统民居建筑构件特征
席慕容乡愁
孩子出现这些症状,可能是抑郁症的前兆|世界精神卫生日
用Arduino蓝牙模块控制LED的详细教程
上涨无量的原因是什么?这种现象反映了市场的哪些情况?
为什么316不锈钢保温杯横行,304是真的不行了
本土散白酒还“香”吗?
薄荷生长的条件与环境(适合薄荷生长的地方与要素,带你了解薄荷的生长秘密)
叶凡:一位被誉为“电视剧歌后”的传奇歌手
秦可卿与太虚幻境:《红楼梦》中最深的伏笔
资本公积金转增注册资本:法律框架与实务操作
生物化学与分子生物学——酶通论
古画里的惊蛰时节:从北宋到清代的春雷画卷
2024年全球手机销量排名:小米第三 TOP5中增速最快
Science:睡眠医学的突破,大脑会在梦境中巩固积极情绪
海南七日游全攻略:八大热门景点与详细行程安排
如何为中小企业设计供应链金融方案?
少先队员走进老司城博物馆感受土司文化魅力
生物技术与生物医学科学:有什么区别?
500块拿不出手?被份子钱压垮的年轻人开始反击
保温电水壶怎么样?都市生活必备的保温煮水神器
果胶铋:胃疼时的“守护神”
治疗胃病必备药物奥美拉唑为何在空腹时服用?慎用与3种药物搭配
2024驾校学费价格表全解析
木纹砖环保价廉木地板温馨自然,环保与经济舒适与颜值,施工攻略一网打尽!