C++:set、map的使用及其特性和区别

C++:set、map的使用及其特性和区别set、map的使用及其特性和区别STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:set,map,multiset,multimap。下面介绍一下这四种容器的简单使用。1.setset里面每个元素只存有一个key值,它支持高效的关键字查询操作,比如检查一个关键字是否在set中。如果这个key值之前存在的话就不插入。简单使用如下:插入:set…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

set、map的使用及其特性和区别

STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:set,map,multiset,multimap。下面介绍一下这四种容器的简单使用。

1.set

set里面每个元素只存有一个key值,它支持高效的关键字查询操作,比如检查一个关键字是否在set中。如果这个key值之前存在的话就不插入。

简单使用如下:

插入:

set<int> s;
	s.insert(2);
	s.insert(1);
	s.insert(4);
	s.insert(5);
	s.insert(3);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	s.insert(5);
	for (auto e : s)
	{ 
   
		cout << e << " ";
	}
	cout << endl;

插入如上数据之后,打印出来的值为1 2 3 4 5。set容器自动对以上数据进行了排序,并且实现了去重。但是不能对set里的值进行修改。

查找:

//时间复杂度:O(logN)----底层是搜索树
set<int>::iterator pos = s.find(3);
//时间复杂度:O(N)----需要遍历一遍(不建议使用)
//set<int>::iterator pos = find(s.begin(), s.end(), 3);
if (pos != s.end())
{ 
   
	cout << "找到了" << endl;
}

set容器中的find查找效率高,因为底层是一个二叉搜索树,比要查找的值小就去左子树查找,反之则去右子树查找。

删除:

//s.erase(3);
s.erase(pos);//找到了我就删,没找到要删的话会报错
for (auto e : s)
{ 
   
	cout << e << " ";
}
cout << endl;

采用s.erase(3);这种操作如果没有3并不会报错,如果有3则会删除这个结点。
找到pos位置,采用s.erase(pos);这种操作如果没有3则会报错,如果有3则会删除这个结点。

交换:

set<int> ss;
ss.insert(6);
ss.insert(9);
ss.insert(8);
ss.insert(7);
ss.insert(10);

ss.swap(s);//交换根节点的指针,效率高
for (auto e : s)
{ 
   
	cout << e << " ";
}
cout << endl;

两个set的交换的其实是交换结点的指针,效率高。

清空:

s.clear();//清掉所有数据
for (auto e : s)
{ 
   
	cout << e << " ";
}
cout << endl;

遍历方法:

//新式for循环
for (auto e : s)
{ 
   
	cout << e << " ";
}
cout << endl;

//迭代器遍历
set<int>::iterator sit = s.begin();
while (sit != s.end())
{ 
   
	cout << *sit << " ";
	sit++;
}
cout << endl;

推荐大家使用新式for循环~比较简单一些٩(๑❛ᴗ❛๑)۶

2. multiset

其实整体的接口和set都相同,但是multiset可以插入key相同的值。

multiset<int> ms;
ms.insert(2);
ms.insert(1);
ms.insert(4);
ms.insert(5);
ms.insert(3);
ms.insert(5);
ms.insert(5);
ms.insert(5);
ms.insert(5);
ms.insert(5);

for (auto e : ms)//可以重复插入相同key值
{ 
   
	cout << e << " ";
}
cout << endl;

auto pos = ms.find(5);
if (pos != ms.end())
{ 
   
	cout << "找到了" << endl;//找到的是中序的第一个5
	while (*pos == 5)//往后继续找可以找到后面所有的5
	{ 
   
		cout << *pos << endl;
		++pos;
		if (pos == ms.end())//pos指向最后一个的下一个
			break;
	}
}

--pos;//倒数第一个5
ms.erase(pos);

for (auto e : ms)//可以重复插入相同key值
{ 
   
	cout << e << " ";
}
cout << endl;

在这里插入图片描述
multiset允许key的冗余,如果用find查找key值时,找到的是中序遍历第一个,因此不断遍历下午可以找到这个multiset里所有的key值。

multiset和set一样不能够对数据进行修改。

3.map

有别于set的是,map是一种key(键),value(值)的形式,用来保存键和值组成的集合,键必须是唯一的,但值可以不唯一。里面的元素可以根据键进行自动排序,由于map是key_value的形式,所以map里的所有元素都是pair类型。pair里面的first被称为key(键),second被称为value(值)。

它可以通过关键字查找映射关联信息value,同时根据key值进行排序。

相关类型的返回值

成员类型 含义
key_type The first template parameter (Key)
mapped_type The second template parameter (T)
value_type pair<const key_type,mapped_type>
简单的使用如下:

插入:

map<string, string> dict;
dict.insert(pair<string, string>("string", "字符串"));//模板类型pair:构造了一个匿名对象插入到map
dict.insert(make_pair("apple", "苹果"));//模板函数make_pair:偷懒了,实际调的是pair
dict.insert({ 
    "left", "左边" });
dict.insert({ 
    "left", "剩余" });//插入不进去了,因为key值已经有了

插入有三种方法:

  1. 采用创建pair的形式插入pair<string, string>("string", "字符串")
  2. 采用make_pair的形式进行插入make_pair("apple", "苹果")
  3. 采用大括号的形式进行插入{ "left", "左边" }

遍历方法:

//新式for循环
for (const auto &e : dict)
{ 
   
	cout << e.first << ":" << e.second << endl;
}
cout << endl;

//迭代器遍历
map<string, string>::iterator mit = dict.begin();
while (mit != dict.end())
{ 
   
	cout << mit->first << ":" << mit->second << endl;
	cout << (*mit).first << ":" << (*mit).second << endl;
	mit++;
}

打印出来为:(根据key值进行了排序和key值的去重)
在这里插入图片描述

operator[ ]:

operator[]可以通过key值找到对应的value值。并且还可以使用operator[]插入数据。

dict["banana"];

如上,插入一个pair,这个pair的key值为“banana”,value为空字符串(\0)

dict["key"] = "关键字";

如上,插入一个pair,这个pair的key值为“key”,value为“关键字”

dict["left"] = "剩余";

如上,因为本来map里“left”这个key值,所以operator[]找到了这个key值,将它的value改成“剩余”。

打印出来为:
在这里插入图片描述

4.multimap

multimap允许key值的冗余,因此key值相同也可以进行插入。

multimap<string, string> mmp;
mmp.insert(pair<string, string>("left", "左边"));
mmp.insert(make_pair("key","关键字"));
mmp.insert({ 
    "map", "地图" });
mmp.insert({ 
    "left", "剩余" });

for (const auto &e : mmp)
{ 
   
	cout << e.first << ":" << e.second << endl;
}

打印出来为:
在这里插入图片描述

set和map特性和区别

set是一种关联式容器,其特性如下:

  1. set以RBTree作为底层容器
  2. 所得元素的只有key没有value,value就是key
  3. 不允许出现键值重复
  4. 所有的元素都会被自动排序
  5. 不能通过迭代器来改变set的值,因为set的值就是键

map和set一样是关联式容器,它们的底层容器都是红黑树,区别就在于map的值不作为键,键和值是分开的。它的特性如下:

  1. map以RBTree作为底层容器
  2. 所有元素都是键+值存在
  3. 不允许键重复
  4. 所有元素是通过键进行自动排序的
  5. map的键是不能修改的,但是其键对应的值是可以修改的
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197817.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu命令卸载软件「建议收藏」

    Ubuntu命令卸载软件「建议收藏」1.打开一个终端,输入dpkg–list,按下Enter键,终端输出以下内容,显示的是你电脑上安装的所有软件。2.在终端中找到你需要卸载的软件的名称,列表是按照首字母排序的。3.在终端上输入命令sudoapt-get–purgeremove包名(–purge是可选项,写上这个属性是将软件及其配置文件一并删除,如不需要删除配置文件,可执行sudoapt-getr…

    2022年5月30日
    38
  • MySQL主从复制配置[通俗易懂]

    MySQL主从复制配置[通俗易懂]MySQL主从复制及读写分离一、MySQL复制的应用常见场景 读写分离,提高查询访问性能,有效减少主数据库访问压力。 实时灾备,主数据库出现故障时,可快速切换到从数据库。 数据汇总,可将多个主数据库同步汇总到一个数据库中,方便数据统计分析。 二、MySQL主从复制原理介绍1、MySQL异步和半同步复制传统的MySQL复制提供了一种简单的主-从复制方法。有一个主,以及一个或多个从。主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新…

    2022年8月13日
    5
  • gdb调试python程序(gdb和seggar)

    一、什么是coredump我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状…

    2022年4月15日
    54
  • Jenkins安装_jenkins安装与配置

    Jenkins安装_jenkins安装与配置前言jenkins的环境搭建方法有很多,本篇使用docker快速搭建一个jenkins环境。环境准备:mac/Linuxdockerdocker拉去jenkins镜像先下载jenkins镜

    2022年7月30日
    6
  • linux中env命令_centos7环境变量配置

    linux中env命令_centos7环境变量配置env命令linux系统中的环境变量是很多的,就算是一些常用的环境变量我们也不一定能记得全名。env命令可以显示当前操作系统所有的环境变量,下面的示例代码是Ubuntu系统的。示例dai@ubuntu:~$envUSER=daiXDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0SSH_AUTH_SOCK=/run/user/

    2022年10月1日
    4
  • yum linux phpmyadmin,Linux centos7 下安装 phpMyAdmin的教程

    yum linux phpmyadmin,Linux centos7 下安装 phpMyAdmin的教程yuminstallhttpdphpmariadb-server–y搭建lamp运行环境之后安装phpMyAdmin遇到的一些问题记录一下1.官网下载phpMyAdmin压缩包wget-chttps://files.phpmyadmin.net/phpMyAdmin/4.9.3/phpMyAdmin-4.9.3-all-languages.tar.gz2.解压缩到/var/www/h…

    2022年5月31日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号