【C++】map和set

目录

  • 一、容器补充
    • 1.序列式容器与关联式容器
    • 2.键值对
    • 3.树形结构的关联式容器
  • 二、set
    • 1.set的介绍
    • 2.set的使用
    • 3.multset的介绍
    • 4.multset的使用
  • 三、map
    • 1.map的介绍
    • 2.map的使用
    • 3.multimap的介绍
    • 4.multimap的使用

一、容器补充

1.序列式容器与关联式容器

我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身,其元素与元素之间并没有什么关联性。

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据查找时比序列式容器效率更高 。

2.键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息 。
在这里插入图片描述

3.树形结构的关联式容器

根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。

二、set

1.set的介绍

1.与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。

2.set中插入元素时,只需要插入value即可,不需要构造键值对。

3.set中的元素不可以重复(因此可以使用set进行去重)。

4.使用set的迭代器遍历set中的元素,可以得到有序序列

5.set中的元素默认按照小于来比较

6.set中查找某个元素,时间复杂度为:log n

7.set中的元素不允许修改

8.set中的底层使用二叉搜索树(红黑树)来实现

2.set的使用

在这里插入图片描述
Compare:仿函数,set中元素的比较方式。

构造函数:

在这里插入图片描述

插入:

在这里插入图片描述

insert 重载了三种插入方法,值、迭代器位置、迭代器区间,这里演示最常用的值插入。

void test_set1()
{//排序 + 去重//去重原理:一个值已经有了,我们就不插入了set<int> s;s.insert(3);s.insert(2);s.insert(4);s.insert(5);s.insert(1);s.insert(1);s.insert(5);set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;
}

在这里插入图片描述

从插入数据我们可以看出,set的功能大致就是将插入的数据进行排序 + 去重,去重的原理是已经存在的值不需要再插入。

删除:
在这里插入图片描述

erase 也重载了三种方法:
① 删除迭代器位置(必须要求迭代器有效,一般配合find使用)、
② 删除值(有这个值就删除,没有也不会报错,底层其实就是封装了迭代器删除的过程,返回值为删除元素个数)、
③ 删除迭代器区间。

void test_set1()
{//排序 + 去重//去重原理:一个值已经有了,我们就不插入了set<int> s;s.insert(3);s.insert(2);s.insert(4);s.insert(5);s.insert(1);s.insert(1);s.insert(5);set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;s.erase(s.begin());  //删除第一个元素 迭代器位置删除it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;s.erase(5);      //删除值为5的位置的元素it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;//删除全部s.erase(s.begin(), s.end());it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;
}

在这里插入图片描述

3.multset的介绍

1.multiset中在底层中存储的是<value, value>的键值对

2.mtltiset的插入接口中只需要插入即可

3,与set的区别是,multiset中的元素可以重复,set是中value是唯一的

4.使用迭代器对multiset中的元素进行遍历,可以得到有序的序列

5.multiset中的元素不能修改

6.在multiset中找某个元素,时间复杂度为: log n

7.multiset的作用:可以对元素进行排序

4.multset的使用

multiset的使用与set几乎一摸一样,唯一不同就是multiset中允许插入重复值。

count函数,返回容器中当前值的相同值的个数

在这里插入图片描述

equal_range函数 - 用来删除数据
在这里插入图片描述

erase函数

删除所有的4,并返回删除个数

在这里插入图片描述

三、map

1.map的介绍

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

2.在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值 key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起, 为其取别名称为pair: typedef pair value_type;

3.在内部,map中的元素总是按照键值key进行比较排序的。

4.map中通过键值访问单个元素的速度通常比unordered_map容器(后面讲)慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。

5.map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。

6.map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))

7.map不支持修改Key,支持修改Value。

2.map的使用

在这里插入图片描述

key: 键值对中key的类型
T: 键值对中value的类型
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器
map 在使用使用上的最大区别就是多了一个模板参数V(文档中给的是T),且使用时是将KV两个模板参数封装在了pair里面。
pair的第一个参数(first)是K,第二个参数(second)是V。

插入

insert函数,参数是一个value_type ,而value_type是一个pair对象,也就是我们前面说的键值对。
insert的返回值 两种情况
1.key已经在树里面,返回pair<书里面可以所在节点的iterator,flase>
2.key不在树中,返回pair<新插入key所在节点的iterator,true>
在这里插入图片描述>  在这里插入图片描述

插入数据可以有三种方法,键值对插入,匿名对象插入,库函数make_pair,以及多参数隐式类型转换(C++11)

在这里插入图片描述

删除:

可以通过某个位置的迭代器删除,也可以通过pair中first删除,也可以通过迭代器区间删除。

在这里插入图片描述

在这里插入图片描述

operator[]

在这里插入图片描述

在这里插入图片描述

所以运算符重载[],有三个作用,进行查找,插入操作,修改操作。

3.multimap的介绍

其特性与map基本一致,只是multimap中可以允许存在重复的key值

4.multimap的使用

在这里插入图片描述


插入

返回值和map不同,因为multimap允许插入重复值,插入数据后返回插入元素的迭代器

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55369.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql之内存池-AllocsetContext

一、简介 postgresql大部分的内存分配管理都是通过MemoryContext进行操作的&#xff0c; 多个相关的MemoryContext构成了一个树型结构&#xff0c; 多个树构成了一个森林。 实现了三种MemoryContext: SlabContextGenerationContextAllocSetContext 使用全局变量CurrentMemo…

哪些情况下需要使用爬虫IP

不知道小伙伴们有没有遇到过这种场景&#xff1a;上网闲逛&#xff0c;看一些搞笑的视频或者想下载一些酷炫的文件&#xff0c;正点击呢&#xff0c;结果却发现被网站限制了&#xff0c;无法访问或者下载&#xff1f; 别急&#xff0c;今天我来告诉大家&#xff0c;如何借助使…

rust基础

这是笔者学习rust的学习笔记&#xff08;如有谬误&#xff0c;请君轻喷&#xff09; 参考视频&#xff1a; https://www.bilibili.com/video/BV1hp4y1k7SV参考书籍&#xff1a;rust程序设计语言&#xff1a;https://rust.bootcss.com/title-page.htmlmarkdown地址&#xff1a;h…

操作系统复习总结1

操作系统复习总结&#xff0c;仅供笔者复习使用&#xff0c;参考教材&#xff1a; 《操作系统原理》 - 何静媛编著. 西安电子科技大学出版社《操作系统考研复习指导》2024年 - 王道论坛组编. 电子工业出版社 本文主要内容为&#xff1a;计算机系统概述&#xff1b; 计算机系…

python-Excel数据模型文档转为MySQL数据库建表语句(需要连接数据库)-工作小记

将指定Excel文档转为create table 建表语句。该脚本适用于单一且简单的建表语句 呈现效果 代码 # -*- coding:utf-8 -*- # Time : 2023/8/2 17:50 # Author: 水兵没月 # File : excel_2_mysql建表语句.py import reimport pandas as pd import mysql.connectordb 库名mydb m…

【JavaSE】面向对象编程思想之多态(图文详解)

目录 1. 多态的概念 2. 多态实现条件 3. 重写 4. 向上转型和向下转型 4.1 向上转型 4.2 向下转型 5. 多态的优缺点 6. 避免在构造方法中调用重写的方法 1. 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&a…

mysql8查看执行sql历史日志、慢sql历史日志,配置开启sql历史日志general_log、慢sql历史日志slow_query_log

0.本博客sql总结 -- 1.查看参数 -- 1.1.sql日志和慢sql日志输出方式(TABLE/FILE)。global参数 SHOW GLOBAL VARIABLES LIKE log_output; -- 1.2.sql日志开关。global参数 SHOW GLOBAL VARIABLES LIKE general_log%; -- 1.3.慢sql日志开关。global参数 SHOW GLOBAL VARIABLE…

freeswitch的mod_xml_curl模块动态获取dialplan

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 mod_xml_curl模块支持从web服务获取xml配置&#xff0c;本文介绍如何动态获取dialplan配置。 环境 centos&#xff1a;CentOS release 7.0 (Final)或以上版本 freeswitch&#xff1a;v1.6.20 GCC&#xff1a;4.8.5…

召唤神龙打造自己的ChatGPT

在之前的两篇文章中&#xff0c;我介绍了GPT 1和2的模型&#xff0c;并分别用Tensorflow和Pytorch来实现了模型的训练。具体可以见以下文章链接&#xff1a; 1. 基于Tensorflow来重现GPT v1模型_gzroy的博客-CSDN博客 2. 花费7元训练自己的GPT 2模型_gzroy的博客-CSDN博客 有…

基于SpringBoot+Vue的地方美食分享网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

0805hw

1. #include <myhead.h> void Bub_sort(int *arr,int n)//冒泡排序 {for(int i1;i<n;i){int count0;for(int j0;j<n-i;j){if(arr[j]>arr[j1]){int temparr[j];arr[j]arr[j1];arr[j1]temp;count;}}if(count0){break;}}printf("冒泡排序后输出结果:\n"…

怎么修改pdf文件中的文字?分享几种编辑方法

怎么修改pdf文件中的文字&#xff1f;PDF格式的文件通常具有很高的可读性和稳定性&#xff0c;但是如果需要修改其中的文字&#xff0c;就需要使用专门的PDF编辑器。本文将介绍几种PDF编辑的方法&#xff0c;下面就跟着我一起来看看这几款工具吧。 方法一&#xff1a;使用迅捷P…