自定义排序规则的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续的更多相关文章

  1. C++STL标准库学习笔记(三)multiset

    C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...

  2. C++STL标准库学习笔记(五)set

    前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...

  3. C++STL标准库学习笔记(一)sort

    前言: 近来在学习STL标准库,做一份笔记并整理好,方便自己梳理知识.以后查找,也方便他人学习,两全其美,快哉快哉! 这里我会以中国大学慕课上北京大学郭炜老师的<程序设计与算法(一)C语言程序设 ...

  4. C++STL标准库学习笔记(二)二分查找

    二.STL中的二分查找算法 1.binary_search 2.lower_bound 3.upper_bound 记得#include<algorithm>! 前言: 在这个笔记中,我把 ...

  5. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  6. STL标准库-容器-set与multiset

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...

  7. STL标准库-容器-set与map

    STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...

  8. 官网实例详解-目录和实例简介-keras学习笔记四

    官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras   版权声明: ...

  9. STL标准库-算法-常用算法

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...

随机推荐

  1. React-Router学习(基础路由与嵌套路由)

    示例:基本路由 在这个例子中,我们有3个'Page'组件处理<Router>. 注意:而不是<a href="/">我们使用<Link to=&quo ...

  2. ES6基础知识(async 函数)

    1.async 函数是什么?一句话,它就是 Generator 函数的语法糖. const fs = require('fs'); const readFile = function (fileNam ...

  3. Spring Cloud Gateway的断路器(CircuitBreaker)功能

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. JVM-学习笔记持续更新

    1.Java虚拟机的基本结构 (1)类加载子系统与方法区: 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放在一块称为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行 ...

  5. [luogu4548]歌唱王国

    (可以参考hdu4652,因此推导过程比较省略) 类似的定义$f_{i}$和$g_{i}$,同样去插入$len$个字符,但注意到并不是任意一个位置都可以作为结尾,$i+j$可以作为结尾当且仅当$s[0 ...

  6. [hdu6761]Minimun Index

    $lyndon\ word$(以下简写为Lw):对于一个字符串s,其为Lw当且仅当其的最小后缀为自身 性质:若$u<v$为LW,那么$uv$也为Lw(反证法即可证) $lyndon$分解:将一个 ...

  7. 【JavaSE】JDK配置

    Java开发环境配置 2020-09-10  08:32:20  by冲冲 1. Windows7安装JDK 1.1 下载JDK ① 下载地址:http://www.oracle.com/techne ...

  8. ound interface org.elasticsearch.common.bytes.BytesReference, but class was expected

    es得版本和本地项目不一致.. 配置es版本,现在使用得是5.2得版本,可是 maven上看到 elasticsearch-rest-high-level-client 最低也得6版本.下载安装高版本 ...

  9. es的rest风格的api文档

    rest风格的api put http://127.0.0.1:9200/索引名称/类型名称/文档id (创建文档,指定文档id) post http://127.0.0.1:9200/索引名称/类型 ...

  10. NFLSOJ 1060 - 【2021 六校联合训练 NOI #40】白玉楼今天的饭(子集 ln)

    由于 NFLSOJ 题面上啥也没有就把题意贴这儿了( 没事儿,反正是上赛季的题,你们非六校学生看了就看了,况且看了你们也没地方交就是了 题意: 给你一张 \(n\) 个点 \(m\) 条边的图 \(G ...