[C++]18:set和map的使用

news2025/1/20 16:30:31

set和map的使用

  • 一.关联式容器:
    • 1.简单概念:
    • 2.<key , value>--->键值对
    • 3.set和map的底层结构(平衡搜索树或者红黑树)
  • 二.set
    • 1.set (排序+不重复)
      • 1.模板参数:
      • 2.set是一个有序存储的容器:
      • 3.set中每个数据有且只有一个:
      • 4.set底层的特殊结构:
      • 5.find和erase的使用:
      • 6.count返回数值个数:
    • 2.multiset(排序+允许重复)
      • 1.set和multiset区别:
      • 2.count的用武之地:
  • 三.map
    • 1.map(排序+不重复)
      • 1.简单概念:
      • 2.插入数据和多种初始化方式:
      • 3.查找和删除:
      • 4.count计数:
      • 5.不允许重复key值插入:
      • 6.数据统计:
      • 7.operator[]的重载:(数据统计优化)
    • 2.multimap(排序+允许重复)
      • 1.map和mulitmap区别:
      • 2.count的用武之地:
      • 3.总结:multimap和map唯一不同的是:map中的key是唯一的,而multimap中的key值是可以重复的。

一.关联式容器:

1.简单概念:

1,map 和 set 是一个关联式容器,比较vector,queue , stack ,序列式的容器来说。关联式容器的结构对于数据的检索是更加方便的。
2.map和set是一种<key , value>的结构。

2.<key , value>—>键值对

SGI_STL中的键值对
通过类的模板参数实现不同类型数据的一一对应:

namespace sfpy {
	template<class T1, class T2>
	struct pair {
		typedef T1 first_type;
		typedef T2 second_type;

		T1 first;
		T2 second;

		prir()
			:first(T1())
			, second(T2())
		{}

		prir(const T1& a, const T2& b)
			:first(a)
			,second(b)
		{}
	};
}

3.set和map的底层结构(平衡搜索树或者红黑树)

1.在特殊情况下我们的搜索二叉树会变成一个单枝的情况。
2.搜索的时间复杂度就大大降低,从高度到个数的复杂度变化。
3.平衡搜索树或者红黑树会在相同可能产生单枝的情况下进行数据的平衡调整,从而保证树的平衡性。

在这里插入图片描述

二.set

1.set (排序+不重复)

1.模板参数:

在这里插入图片描述

2.set是一个有序存储的容器:

1.insert进行数据的插入。
2.使用迭代器遍历数据。
3.set默认的比较方式是一个升序。
4.set中的数据是不可以随便进行修改的需要保证有序

在这里插入图片描述

3.set中每个数据有且只有一个:

1.相同的数据不能存贮多个在set中。
2.set中每个数据有且只有一个。

在这里插入图片描述

4.set底层的特殊结构:

1.set中不存在<< key value>>的结构—>实际底层是 << value value>> 的结构
2.set在插入数据的时候其实对底层的pair的两个value都插入数据但是在上层我们只需要去插入一个数据,不需要考虑pair的存在。

5.find和erase的使用:

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

情况一
1,传数据的值,返回相同数据的迭代器,如果数据的不存在返回最后一个数值迭代器的下一个。
2.erase的重载一进行配合使用:
3.缺点:删除的数据一定存在否则一定报错。

删除数据存在的情况:
在这里插入图片描述
删除的数据不存在的情况:
在这里插入图片描述

情况二:
1.可以直接对erase传需要删除的数据的值。
2.情况一:存在就删除。
3.情况二:不存在就不删除,不会产生越界的问题。

情况一:存在就删除。
在这里插入图片描述

情况二:不存在就不删除,不会产生越界的问题

在这里插入图片描述

情况三:范围删除

1set的erase的范围删除是需要满足左闭右开的一个范围删除。
2.find的使用就不能非常好的满足条件?
3.find查找数据的依据是传参的数值是否在set中存在!
4.显然find的查找范围就非常的不靠谱,set中提供了两个方法。
5.lower_bound 和 upper_bound
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.count返回数值个数:

1,因为set要求(排序+不重复)特殊结构 ,count只有两个数值0或者1

2.multiset(排序+允许重复)

1.set和multiset区别:

1.允许key值的冗余。
2.数据的插入比较随意但是考虑平衡性。
3.find的查找存在多个返回中序的第一个相同数据的迭代器。

4.multiset中的数据是不可以随便进行修改的需要保证有序

在这里插入图片描述

2.count的用武之地:

1.统计重复的数据的个数:

在这里插入图片描述

三.map

1.map(排序+不重复)

在这里插入图片描述

1.简单概念:

1.map是一个关联性容器底层存储一个pair类。
2.对于pair来说==< key value>== 两个对象的类型可能是不相同的。

2.插入数据和多种初始化方式:

1.构建对象然后传参
2.使用make_pair
3.多参数构造函数提供的隐式类型转换。

在这里插入图片描述

3.查找和删除:

在这里插入图片描述

1.An iterator to the element, if an element with specified key is found, or map::end otherwise.—传数据的值,返回相同数据的迭代器,如果数据的不存在返回最后一个数值迭代器的下一个。

在这里插入图片描述

1.这些内容和set中都是一样的,但是注意每次都是通过key值去进行考虑的,value值是不参与的。

在这里插入图片描述

4.count计数:

1.不允许重复key数据的出现所以count在map中同样也i是0或者1.

5.不允许重复key值插入:

进行测试:
在这里插入图片描述

6.数据统计:

方法一:find+insert:
在这里插入图片描述

void text_5_4()
{
	map<string, int> m1;
	const char* str[] = { "葡萄","西瓜","苹果","香蕉","草莓","葡萄",
	"西瓜","西瓜","苹果","香蕉","草莓" "葡萄","西瓜","苹果","香蕉",
	"草莓","草莓","西瓜","西瓜","葡萄","葡萄","香蕉","香蕉","苹果" };

	//1.简单的数据统计:
	for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++)
	{
		auto tmp = m1.find(str[i]);
		//1.第一次插入:
		if (tmp == m1.end())
		{
			m1.insert(make_pair(str[i], 1));
		}
		//2.不是第一次插入:
		else
		{
			((*tmp).second)++;
		}
	}

	map<string, int>::iterator it = m1.begin();
	while (it != m1.end())
	{
		cout << (*it).first << ":" << (*it).second << endl;
		it++;
	}
	cout << endl;
}

在这里插入图片描述

方法二:insert返回值pair类型:
在这里插入图片描述

void text_5_5()
{
	map<string, int> m1;
	const char* str[] = { "葡萄","西瓜","苹果","香蕉","草莓","葡萄",
	"西瓜","西瓜","苹果","香蕉","草莓" "葡萄","西瓜","苹果","香蕉",
	"草莓","草莓","西瓜","西瓜","葡萄","葡萄","香蕉","香蕉","苹果" };

	//1.简单的数据统计:
	for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++)
	{
		//1.bool 为true说明当前插入值不存在:
		pair<map<string, int>::iterator,bool> ret = m1.insert(make_pair(str[i], 1));
		//2.bool 为false说明当前插入值已经存在:
		if (!ret.second)
		{
			((*(ret.first)).second)++;
		}
	}

	map<string, int>::iterator it = m1.begin();
	while (it != m1.end())
	{
		cout << (*it).first << ":" << (*it).second << endl;
		it++;
	}
	cout << endl;
}

在这里插入图片描述

7.operator[]的重载:(数据统计优化)

在这里插入图片描述

void text_5_6()
{
	map<string, int> m1;
	const char* str[] = { "葡萄","西瓜","苹果","香蕉","草莓","葡萄",
	"西瓜","西瓜","苹果","香蕉","草莓" "葡萄","西瓜","苹果","香蕉",
	"草莓","草莓","西瓜","西瓜","葡萄","葡萄","香蕉","香蕉","苹果" };

	//1.简单的数据统计:
	for (int i = 0; i < sizeof(str) / sizeof(str[0]); i++)
	{
		m1[str[i]]++;
	}

	map<string, int>::iterator it = m1.begin();
	while (it != m1.end())
	{
		cout << (*it).first << ":" << (*it).second << endl;
		it++;
	}
	cout << endl;
}

在这里插入图片描述

2.multimap(排序+允许重复)

1.map和mulitmap区别:

1.multimap不适合用于数据统计可以存放相同类型的key值。

在这里插入图片描述

2.count的用武之地:

在这里插入图片描述

3.总结:multimap和map唯一不同的是:map中的key是唯一的,而multimap中的key值是可以重复的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL常用容器(string容器)---C++

STL常用容器目录 1.string容器1.1 string基本概念1.2 string构造函数1.3 string赋值操作1.4 string字符串拼接1.5 string查找和替换1.6 string字符串比较1.7 string字符存取1.8 string插入和删除1.9 string子串 1.string容器 1.1 string基本概念 本质&#xff1a; string是C…

Peter算法小课堂—动态规划

Peter来啦&#xff0c;好久没有更新了呢 今天&#xff0c;我们来讨论讨论提高组的动态规划。 动态规划 动态规划有好多经典的题&#xff0c;有什么背包问题、正整数拆分、杨辉三角……但是&#xff0c;如果考到陌生的题&#xff0c;怎么办呢&#xff1f;比如说2000年提高组的…

计算机网络:思科实验【2-MAC地址、IP地址、ARP协议及总线型以太网的特性】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学&#xff0c;回复思科获取下载链接。 实验目的实验环境实验内容MAC地址、IP地址、ARP协议总线型以太网的…

渗透工具——kali中wpscan简介

一、什么是wpscan 1、常用于做用户名枚举爆破 2、WPScan是一个扫描 WordPress 漏洞的黑盒子扫描器&#xff0c;它可以为所有 Web 开发人员扫描 WordPress 漏洞并在他们开发前找到并解决问题。我们还使用了 Nikto &#xff0c;它是一款非常棒的Web 服务器评估工具&#xff0c;…

MySQL数据库调优之关联查询、排序查询、分页查询、子查询、Group by优化

关联查询优化 1.准备工作 CREATE TABLE IF NOT EXISTS type(id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,card INT(10) UNSIGNED NOT NULL,PRIMARY KEY(id));CREATE TABLE IF NOT EXISTS book( bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED N…

智慧应急与物联网相结合:物联网技术如何提升智慧应急响应能力

目录 一、引言 二、智慧应急与物联网技术的结合 三、物联网技术提升智慧应急响应能力的途径 四、物联网技术在智慧应急中的应用案例 五、物联网技术在智慧应急中面临的挑战与解决方案 挑战一&#xff1a;技术标准与规范不统一 解决方案&#xff1a; 挑战二&#xff1a;…

【考研数学】基础阶段习题1800和660怎么选❓

我建议以1800题为主 1800题包含基础和强化两部分&#xff0c;基础部分题量很大&#xff0c;类型也很全面&#xff0c;并且难度一点也不高&#xff0c;适合基础不好的学生来做。 660题难度比较大&#xff0c;不适合基础阶段做。 660题虽然名字叫基础训练&#xff0c;但是不适…

英语连读技巧15

1. first one – 第一个 连读听起来就像是&#xff1a;【佛斯湾】 连读的音标为&#xff1a; 例句&#xff1a;I don’t want to be the first one there agin. 发音指导&#xff1a;在“first one”的连读中&#xff0c;"t"和"o"之间的连接几乎消失&a…

Java线程池实现原理详解

线程池是什么 线程池&#xff08;Thread Pool&#xff09;是一种基于池化思想管理线程的工具&#xff0c;经常出现在多线程服务器中&#xff0c;如MySQL。 线程过多会带来额外的开销&#xff0c;其中包括创建销毁线程的开销、调度线程的开销等等&#xff0c;同时也降低了计算…

03|Order by与Group by优化

索引顺序依次是 &#xff1a; name,age,position 案例1 EXPLAIN SELECT * FROM employees WHERE name LiLei AND position dev ORDER BY age;分析: 联合索引中只是用到了name字段做等值查询[通过key_len 74可以看出因为name字段的len74]&#xff0c;在这个基础上使用了age进…

sql-labs32关宽字节注入

一、环境 网上有自己找很快 二、如何通关 2.1解释 虚假预编译没有参数绑定的过程&#xff0c;真实预编译有参数绑定的过程 宽字节注入出现的本质就是因为数据库的编码与代码的编码不同&#xff0c;导致用户可以通过输入精心构造的数据通过编码转换吞掉转义字符。 在32关中…

华为HCIP Datacom H12-831 卷24

多选题 1、如图所示&#xff0c;某园区部署OSPF实现网络互通&#xff0c;其中Area1部署为NSSA区域。某工程师为了实现R1访问R4的环回口地址&#xff0c;在R4的OSPF进程中引入直连路由。以下关于该场景的描述,错误的有哪些项? A、在R4引入直连路由后&#xff0c;R1通过转换后的…

Java基于物联网技术的智慧工地云管理平台源码 依托丰富的设备接口标准库,快速接入工地现场各类型设备

目录 风险感知全面化 项目进度清晰化 环境监测实时化 人员管理高效化 工地数字化 数据网络化 管理智慧化 智慧工地平台整体架构 1个可扩展监管平台 2个应用端 3方数据融合 N个智能设备 智慧工地的远程监管&#xff0c;是工地负责人掌握施工现场情况的必要手段&…

第6.4章:StarRocks查询加速——Colocation Join

目录 一、StarRocks数据划分 1.1 分区 1.2 分桶 二、Colocation Join实现原理 2.1 Colocate Join概述 2.2 Colocate Join实现原理 三、应用案例 注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Colocation Join 官网文章地址&#xff1a; Colocate Join | StarRoc…

JAVA算法和数据结构

一、Arrays类 1.1 Arrays基本使用 我们先认识一下Arrays是干什么用的&#xff0c;Arrays是操作数组的工具类&#xff0c;它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下&#xff1a;遍历、拷贝、排序等操作。需要用到的方法如下 public…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

音视频数字化(数字与模拟-电影)

针对电视屏幕,电影被称为“大荧幕”,也是娱乐行业的顶尖产业。作为一项综合艺术,从被发明至今,近200年的发展史中,无人可以替代,并始终走在时代的前列。 电影回放的原理就是“视觉残留”,也就是快速移过眼前的画面,会在人的大脑中残留短暂的时间,随着画面不断地移过,…

智慧城市,未来已来:数字中国建设中的创新实践

随着数字技术的飞速发展&#xff0c;中国正迎来一个全新的智慧城市时代。在这个时代&#xff0c;城市的每一个角落都充满了科技的气息&#xff0c;人们的生活也因此变得更加便捷、高效和美好。今天&#xff0c;就让我们一起走进这个充满未来感的智慧城市&#xff0c;探索数字中…

onlyoffice api开发

编写代码 按照https://api.onlyoffice.com/editors/basic编写代码 <html> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scal…

长短连接对压测的影响有多大

【引言】 当我们进行压力测试时&#xff0c;长短连接是一个非常重要的参数。但是&#xff0c;你知道吗&#xff1f;长短连接对于压测结果有着非常大的影响&#xff01;如果你不理解这个参数&#xff0c;那么你的压测结果可能会出现严重的偏差。 在这篇文章中&#xff0c;我将…