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 修饰的重载小于号的函数。因为一旦在重载小于号的函数修改了结构体中某个变量的值,就有可能导致排序结果是错误的。
热门推荐
南墙非墙:成语“不撞南墙不回头”的文化解读
四季度是冬季根治欠薪的关键时间节点,如何确保农民工工资不拖欠
离职后拖欠工资怎么处理最有效
现金为王,何以为王?
拖欠工资对公司的影响及应对措施
废旧电池处理的重要性与环保意识提升的多种方法探讨
新型网络攻击够通过无线充电器引发智能手机起火
手机拍照画质提升技巧:从焦点、光线到后期处理!
高端手表回收成新宠,通州市场繁荣背后存隐忧
74.8亿美元身家的特朗普:私人飞机与118房庄园
从普通理发师到“城市名片”:晓华爆红背后的理发店梦想
麻辣虾烹饪全攻略:经典、香辣、专业版做法详解
告别臃肿!这样穿冲锋衣既舒适又显瘦
2024冬季红色穿搭指南:从正红到酒红的搭配技巧
一抹红点亮秋冬:实用红色单品搭配指南
曲靖市探索旅游促进各民族交往交流交融新路径
每天了解一个城市—云南·曲靖,云南第二大城市
云南10大经典名菜,汽锅鸡只能排第6,最后1道外地人不敢轻易尝试
曙光英雄白浩出装攻略:新手必看!
银滩女神雕塑与银滩圆球雕塑:广西北海市的两座文化地标
宝宝沐浴露挑选指南:从成分到包装全方位解析
COPD肺康复指南:从运动训练到心理支持
个性化评估+八大疗法:COPD患者肺康复治疗指南
叶祖新再现《九重紫》太子造型引爆时尚活动
叶祖新微博求职引热议,网友花式推荐角色
叶祖新微博寻新角引热议:从《九重紫》三分钟太子到实力派的坚守
龙洋PK马凡舒:2025央视春晚“一姐”之争
丁禹兮亮相2025央视春晚,演绎传统文化新魅力
当心!"扫码添加明星QQ"背后暗藏诈骗陷阱
软件开发入门指南:流程、角色与环境全解析