C++STL标准库学习笔记(四)multiset续
自定义排序规则的multiset用法
前言:
在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,只不过这一次的笔记主要是我的补充,全部使用蓝色字体就比较瞎眼了,所以这一次不会用蓝色字体。
书接前文,上次我们介绍了multiset的基本用法(https://www.cnblogs.com/AwakeFantasy/p/15669355.html),这里我们继续,介绍multiset的自定义排序规则用法和结构体的用法。
1.1 自定义排序规则
先给上代码样例:
1 #include<set>
2 #include<iostream>
3 #include<cstring>
4 using namespace std;
5
6 struct rule1
7 {
8 bool operator()(const int & a,const int & b)
9 {
10 return (a%10) < (b%10);
11 }//返回值为true说明a必须排在b前面
12 };
13 int main(int argc, char const *argv[])
14 {
15 multiset<int,greater<int>>st;//排序规则为从大到小
16 int a[10] = {1,14,12,13,7,13,21,19,8,8};
17 for (int i = 0; i < 10; i++)
18 {
19 st.insert(a[i]);
20 }
21 multiset<int,greater<int>>::iterator i;
22 for (i = st.begin(); i != st.end(); i++)
23 {
24 cout<<*i<<",";//结果:21,19,14,13,13,12,8,8,7,1,
25 }
26 cout<<endl;
27 multiset<int,rule1>st2;
28 //st2的排序规则为:个位数小的排前面
29 for (int i = 0; i < 10; i++)
30 {
31 st2.insert(a[i]);
32 }
33 multiset<int,rule1>::iterator p;
34 for ( p = st2.begin(); p != st2.end(); p++)
35 {
36 cout<<*p<<",";//结果:1,21,12,13,13,14,7,8,8,19,
37 }//这里的结果就具有不确定性了,1和21谁在前面都可以的
38 cout<<endl;
39 p = st2.find(133);//经典,查找不是找==,而是找x<y和y<x都不成立的条件
40 //就是x既不在y前面,也不在y后面的情况
41 //这里的情况就是13和133按这个排序顺序是相同的,所以找得到
42 cout<<*p<<endl;//结果:13
43 return 0;
44 }
样例1
其中简单介绍一下几个重要的地方:
multiset<int,greater<int>>st;
multiset<int,greater<int>>::iterator i;
multiset<int,rule1>st2;
multiset<int,rule1>::iterator p;
可以看到它们的定义确实和之前使用sort时一模一样,需要强调的地方其实也差不多:
1、find()查找是按x既不在y前面,也不在y后面的规则来查找的,而不是找x == y。
2、排序顺序也是按自定义的来排,这个例子中的rule1并没有定义个位数相同时,十位数及以上怎么排序,所以14和13按这个规则排序谁在前面都有可能。
1.2 结构体及其自定义排序规则
也先给上代码样例:
1 #include<set>
2 #include<iostream>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6
7 struct Student
8 {
9 char name[20];
10 int id;
11 int score;
12 };
13 Student students [] =
14 {
15 {"Jack",112,78},
16 {"Mary",102,85},
17 {"Ala",333,92},
18 {"Zero",101,70},
19 {"Cindy",102,78}
20 };
21 struct rule
22 {
23 bool operator()(const Student & s1,const Student & s2)
24 {
25 if (s1.score != s2.score)
26 {
27 return s1.score>s2.score;
28 }
29 else
30 {
31 return(strcmp(s1.name,s2.name) < 0);
32 }
33 }
34 };
35 int main(int argc, char const *argv[])
36 {
37 multiset<Student,rule> st;
38 for (int i = 0; i < 5; i++)
39 {
40 st.insert(students[i]);//插入的是students[i]的复制品
41 }
42 multiset<Student,rule>::iterator p;
43 for ( p = st.begin(); p != st.end(); p++)
44 {
45 cout<<p->score<<" "<<p->name<<" "<<p->id<<endl;
46 }
47 /*
48 结果:
49 92 Ala 333
50 85 Mary 102
51 78 Cindy 102
52 78 Jack 112
53 70 Zero 101
54 */
55 Student s = {"Mary",1000,85};
56 p = st.find(s);
57 if (p!=st.end())
58 {
59 cout<<p->score<<" "<<p->name<<" "<<p->id<<endl;
60 }//结果:85 Mary 102
61 //因为我们没比较id,所以。。。找到了
62 //这里再次强调一次不是比==,而是比排序
63 return 0;
64 }
样例2
这里需要强调的其实也差不多:
multiset<Student,rule> st;
multiset<Student,rule>::iterator p;
例子中再次说明了查找不是找“==”,这里就不再赘述了。
后记:
这玩意确实可以融会贯通,用法都差不多,记住就行。感谢大家读到这里,祝大家学业有成,天天开心,不要又没摸着鱼,又没学到东西,那就不好了。
(吐槽一下,这一篇好短,这就是摸鱼吗)
C++STL标准库学习笔记(四)multiset续的更多相关文章
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- C++STL标准库学习笔记(五)set
前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...
- C++STL标准库学习笔记(一)sort
前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...
- C++STL标准库学习笔记(二)二分查找
二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- STL标准库-容器-set与multiset
技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...
- STL标准库-容器-set与map
STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...
- 官网实例详解-目录和实例简介-keras学习笔记四
官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras 版权声明: ...
- STL标准库-算法-常用算法
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...
随机推荐
- SQL语句修改字段类型与第一次SQLServer试验解答
SQL语句修改字段类型 mysql中 alert table name modify column name type; 例子:修改user表中的name属性类型为varchar(50) alert ...
- JAVA后端方面,如何快速达到能实习的程度
概要地讲,是先广度再深度,面试开发两手抓. 首先说学习方法,因为很多初学者没继续下去,不是能力不行,而是方法不当.对比下错误和正确的方法. 1 光看视频光看资料不动手连,这样转眼就忘.正确的做 ...
- ES6学习 第五章 正则的扩展
前言 本章介绍正则的扩展.有些不常用的知识了解即可. 本章原文链接:正则的扩展 RegExp 构造函数 从 ES6 开始,如果RegExp构造函数第一个参数是一个正则对象,并且第二个标志存在且为标志参 ...
- 微信小程序中途加入云开发之坑
一开始未使用云开发的小程序项目,之后想使用云开发能力时,要先删除对应在开发者工具中的项目(先压缩备份源码!),再用开发者工具重新创建,很多时候都需要用这种方式进行处理
- Codeforces 1137F - Matches Are Not a Child's Play(LCT)
Codeforces 题面传送门 & 洛谷题面传送门 考虑将一个点 \(x\) 的编号变为当前所有点编号最大值 \(+1\) 会对每个点的删除时间产生怎么样的影响.由于编号最大的点肯定是最后一 ...
- C++匿名函数的使用
c++匿名函数使用方法 1.匿名函数的使用 匿名函数的基本语法为: //[捕获列表](参数列表)->返回类型{函数体} int main() { auto Add = [](int a, int ...
- Python中关于join函数的陷阱?
目录 说明 数据说明 正确示例 错误示例 解决办法 说明 最近在用Python的join函数连接多个列表时,出现了如下两个错误,即合并类型不一致.折腾了很久才找到原因,真是基础不牢,地动山摇. Typ ...
- python-django使用ORM模型增删改查CRUD
from weibo.models import WeiboUser as User user_obj = User.objects.get(pk=1) user_obj.pk Out[4]: 1 u ...
- 从 ClickHouse 到 ByteHouse:实时数据分析场景下的优化实践
本文来自火山引擎公众号,原文发布于2021-09-06. 近日,字节跳动旗下的企业级技术服务平台火山引擎正式对外发布「ByteHouse」,作为 ClickHouse 企业版,解决开源技术上手难 &a ...
- 从分布式锁角度理解Java的synchronized关键字
分布式锁 分布式锁就以zookeeper为例,zookeeper是一个分布式系统的协调器,我们将其理解为一个文件系统,可以在zookeeper服务器中创建或删除文件夹或文件.设D为一个数据系统,不具备 ...