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 修饰的重载小于号的函数。因为一旦在重载小于号的函数修改了结构体中某个变量的值,就有可能导致排序结果是错误的。
热门推荐
侯景之乱:南梁的末路和士族的衰落
侯景之乱与梁陈之际的名士处境
黑白灰穿搭法则,如何把基础色穿出高级感
美国马桶前的缺口设计:不只是一个小细节
【数学二】中值定理、不等式与零点问题-不等式的证明
大型车间工业噪声治理方案及措施
哪里可以找到最新的产业发展趋势数据?
白砗磲真假辨别方法
首次配属!新款CR200J型 “复兴号”动车组上线西南铁路
浴室设计尺寸全攻略:从门到马桶,打造舒适卫浴空间
买车省钱全攻略:砍价技巧与谈判策略详解
生肖属蛇好不好?深入分析属蛇人的性格与运势
我的世界指南:如何促进村民繁殖?
水泥与沙子的最佳比例
银行金融衍生品定价原理深度剖析
全浮式与半浮式后桥:三轮摩托车及轻型货车的承重区别解析
汽车半轴的两种分类:全浮式与半浮式
@抑郁、焦虑、失眠患者:国家卫健委《心理健康素养十条》
5种“公认”好吃葡萄排行榜!阳光玫瑰竟然排第五?你都吃过哪些
葡萄是高糖水果吗?我来告诉你
邻伞花烃-5-醇在化妆品中的应用及其刺激性
自媒体内容营销:从技巧到策略的全方位指南
自己在家熬猪油,要注意哪些事?
如何正确添加燃油添加剂?这种添加方法对发动机性能有何影响?
现代根管治疗术详解
冬季空调使用技巧,快速提升室内温度
男生社交恐惧症怎么解决的
浙江软硬件产品检测如何做?流程与要点
中药研究首登《柳叶刀》,20年老药被证无效?
西蒙尼:所有马竞人都怀着愤怒和恼火 巴萨若获胜就基本锁定冠军