IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【c++】——map和set -> 正文阅读

[数据结构与算法]【c++】——map和set

概念

set的底层是红黑树(也就是平衡二叉搜索树),是一种关联式容器,它的作用主要进行搜索,搜索效率为logn,它的特性只有一个键值key,set不允许出现两个元素是键值。其中的键值我们是不能被修改,因为修改key就会破坏set的结构,所以它的key值被设置为const。

?insert接口

pair<iterator,bool> insert (const value_type& val);

?返回值是一个pair类型,在set中,该val值不存在,则插入成功,则返回的pair值第一个值是插入该节点的迭代器,第二个值为true,如果该val存在,则插入失败,则返回pair的第一个值是已存在val节点的迭代器,第二个值是false。

?????????

?set测试:

?

输出结果?

?1.set遍历方式有两种,一种是迭代器,一种是范围for,这两种方式的遍历都是中序遍历,我们看到set中的值都是独一无二的,相同的值是不会插入到set中。

?2.find查找set中的某个值,找到返回该值的迭代器,找不到返回end();

判断单词是否在set中。?

测试:

?????????

总结:

1.set中的节点中只有一个值key,且每个key值是独一无二的

2.set插入值的同时,可以通过bool值判断该值是否在set中。

3.pair是一个类模板

template <class T1, class T2> struct pair;

在pair中存储两个值,一个是T1类型的值为first,另一个是T2类型的值为second。

pair模板中还存在一个make_pair成员函数,直接返回pair的匿名对象,这个在map中会经常用到。

template <class T1,class T2> 
pair<T1,T2> make_pair (T1 x, T2 y)

  {

    return ( pair<T1,T2>(x,y) );

  }

multiset

multiset中的特性以及用法是与set是完全相同的,唯一的差别是它允许键值重复,它的底层也是红黑树。

测试:

?

?multiset允许key冗余,并且multiset中的find是按中序遍历的查找的第一个1.

map

key: 键值对中 key 的类型
T : 键值对中 value 的类型
Compare: 比较器的类型, map 中的元素是按照 key 来比较的,缺省情况下按照小于来比较,一般情况 下( 内置类型元素 ) 该参数不需要传递,如果无法比较时 ( 自定义类型 ) ,需要用户自己显式传递比较规则 (一般情况下按照函数指针或者仿函数来传递)

概念:

? ?1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素

2. map 中,键值 key 通常用于排序和惟一地标识元素,而 value中存储与此键值key 关联的内容。键值 key和值 value 的类型可能不同,并且在 map 的内部, keyvalue通过成员类型value_type 绑定在一起, 为其取别名称为pair,其中key值在map中是不能被修改的,value是可以被修改的
3.key值和value是不能直接插入到map容器中,需要将这两个值存到pair变量中才能插入到map中。
4. 在内部, map 中的元素总是按照键值 key 进行比较排序的。
pair<iterator,bool> insert (const value_type& val);

如果map不存在val这个值的节点,那么就将该值的节点插入到map,并且返回的pair中的iterator是指向新插入该节点的迭代器,bool是true,如果存在该val这个值的节点,那么就不再插入,则返回已存在节点的iterator的迭代器,bool是false。

map的函数重载[]的实现如下,
mapped_type& operator[] (const key_type& k)
{
?? ?typedef pair< key_type, mapped_type> e;
?? ?pair<e, bool> it = this->insert(make_pair(k, mapped_type());
?? ?return (*it).first)).second;
}

如果map不存在k这个节点,那么这个节点就会被插入到map中,并且返回该节点的second引用,如果map存在k这个节点,那么这个节点就不会插入到map中,直接返回该节点的second。

?测试:

统计单词次数:

统计次数一:

统计次数二:?

?

?统计次数三:

?

对所有单词的次数进行排序

对m3中的单词次数从上到下进行排序。?

排序一:

仿函数MapItCompare

?将m3中的迭代器存入到vector中,然后利用sort进行排序,sort会根据MapItCompare仿函数进行排序,其中MapItCompare是自定义的仿函数。

?

?排序二

?map利用迭代器访问会自动根据key值进行排序,greater是库中的仿函数,会将map排成一个降序。

?总结:

1.map中的元素是键对值。

2.map中的key是唯一的,不可被修改,value不是唯一的,可以被修改。

3.map中利用迭代器遍历,可以得到一个有序序列。

4.map的底层是红黑树,它的搜索效率是logn。

multimap

multimap的用法和功能是类似的,只是multimap允许key值冗余。

题目:

?思路:

1.先用map统计出所有单词的次数,然后multimap根据次数进行排序,迭代器遍历会自动的进行排序,greater<int>排的是降序,然后将前n个字符插入到vector中。

2.时间复杂度为O(N*logN)

? 空间复杂度为O(N)

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:09:33  更:2021-11-27 10:11:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:30:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码