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

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值是可以重复的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iconfont的组件化使用方法(SVG)

目录 一、需求描述二、操作步骤1.在iconfont中选择项目需要使用的图标2.在项目中创建iconfont.js3.创建svgIcon组件 一、需求描述 将iconfont图标库选择的图标以SVG的形式引入项目并通过组件化的形式在项目中引用可控制图标的大小和颜色 二、操作步骤 1.在iconfont中选择项目…

H264/H265基本编码参数1

本文主要讲解一些视频编码相关的基本概念 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。我们来直观地看看像素是怎么组成图像的。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素。 分辨…

猫头虎分享已解决Bug || TypeError: Object(...) is not a function (React Hooks)

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

vue3 使用qrcodejs2-fix生成二维码并可下载保存

直接上代码 <el-button click‘setEwm’>打开弹框二维码</el-button><el-dialog v-model"centerDialogVisible" align-center ><div class"code"><div class"content" id"qrCodeUrl" ref"qrCodeUrl&q…

C++ //练习 9.18 编写程序,从标准输入中读取string序列,存入一个deque中。编写一个循环,用迭代器打印deque中的元素。

C Primer&#xff08;第5版&#xff09; 练习 9.18 练习 9.18 编写程序&#xff0c;从标准输入中读取string序列&#xff0c;存入一个deque中。编写一个循环&#xff0c;用迭代器打印deque中的元素。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&am…

成都直播基地产业合规指南 共促直播行业和谐发展

随着互联网技术的不断发展&#xff0c;直播行业正迅速崛起&#xff0c;成为当今社会最具有影响力和商业价值的行业之一。而作为直播行业中的重要组成部分&#xff0c;各大互联网机构在推动直播产业发展的过程中扮演着至关重要的角色。天府锋巢直播产业基地作为成都规模最大的直…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了&#xff0c;重试和统计。 4. 任务量大&#xff0c;分片执行。 二、xxl-job路由策略 1. FIRST&#xff08;第一个&#xff09;&#xff1a;固定选择第一个机器。 2. LAST&#x…

FreeRTOS 的队列基础API函数的使用

参考教程来源 //* 实验平台:启明欣欣 STM32F407应用开发板(高配版) 参考正点原子 #include "freertos_demo.h" #include "./SYSTEM/usart/usart.h" #include "led.h" #include "lcd.h" #include "key.h"/*FreeRTOS*********…

C++类和对象篇

1.类的定义 在C语言结构体中&#xff0c;只能定义变量&#xff0c;C扩展了类的概念&#xff0c;能够在类定义函数&#xff1b;同时&#xff0c;struct仍然可以使用&#xff0c;但更常用class来表示类 1.1类中函数的两种定义方式 函数的声明和定义都在类中 class Date { public:…

Pytorch训练RCAN QAT超分模型

Pytorch训练RCAN QAT超分模型 版本信息测试步骤准备数据集创建容器生成文件列表创建文件列表的代码执行脚本,生成文件列表训练RCAN模型准备工作修改开源代码编写训练代码执行训练脚本可视化本文以RCAN超分模型为例,演示了QAT的训练过程,步骤如下: 先训练FP32模型再加载FP32训练…

Qt QWidget 简约美观的加载动画 第二季

&#x1f603; 第二季来啦 &#x1f603; 简约的加载动画,用于网络查询等耗时操作时给用户的提示. 这是最终效果: 一共只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #i…

LeetCode704. 二分查找(C++)

LeetCode704. 二分查找 题目链接代码 题目链接 https://leetcode.cn/problems/binary-search/description/ 代码 class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while(left < right){int midd…

主机字节序与网络字节序

大端序和小端序 大端序&#xff08;Big Endian&#xff09;和小端序&#xff08;Little Endian&#xff09;是两种计算机存储数据的方式。 大端序指的是将数据的高位字节存储在内存的低地址处&#xff0c;而将低位字节存储在内存的高地址处。这类似于我们阅读多位数时从左往右…

1.0 RK3399项目开发实录-Ubuntu环境搭建(物联技术666)

1.下载Ubuntu所需的版本&#xff1a;Index of /releases 2.安装vmplayer:Download VMware Workstation Player | VMware 3.安装Ubuntu时&#xff0c;磁盘空间尽量大些&#xff0c;开发板系统包都比较大&#xff0c;避免存不下&#xff0c;建议空间100G。 关闭Ubuntu自动更新…

卡玛网● 46. 携带研究材料 ● 01背包问题,你该了解这些! 滚动数组 力扣● 416. 分割等和子集

开始背包问题&#xff0c;掌握0-1背包和完全背包即可&#xff0c;注&#xff1a;0-1背包是完全背包的基础。 0-1背包问题&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求…

【C进阶】顺序表详解

文章目录 &#x1f4dd;线性表的概念&#x1f320; 顺序表&#x1f309;顺序表的概念 &#x1f320;声明--接口&#x1f309;启动&#x1f320;初始化&#x1f309;扩容&#x1f320;尾插&#x1f309; 打印&#x1f320;销毁&#x1f309; 尾删&#x1f320;头插&#x1f309;…

内存函数(C语言进阶)

目录 前言 1、memcpy 2、memmove 3、memcmp 4、memset 结语 前言 本篇介绍了C语言中的内存函数&#xff0c;内存函数&#xff0c;顾名思义就是处理内存的函数。 1、memcpy memcpy&#xff1a;内存拷贝函数。 相对于strcpy只能拷贝字符串来讲&#xff0c;memcpy能拷…

Mysql学习之事务日志undolog深入剖析

Undo log redo log 是事务持久性的保证&#xff0c;undo log是事务原子性的保证。在事务中更新数据的前置操作其实是要先写入一个undo log。 如何理解undo 日志&#xff1f; 事务需要保证原子性&#xff0c;也就是事务中的操作要么全部完成&#xff0c;要么什么也不做。但有时…

kitti数据显示

画出track_id publish_utils.py中 def publish_3dbox(box3d_pub, corners_3d_velos, types, track_ids):marker_array MarkerArray()for i, corners_3d_velo in enumerate(corners_3d_velos):marker Marker()marker.header.frame_id FRAME_IDmarker.header.stamp rospy.T…

kubernetes的网络flannel与caclio

flannel网络 跨主机通信的一个解决方案是Flannel&#xff0c;由CoreOS推出&#xff0c;支持3种实现&#xff1a;UDP、VXLAN、host-gw udp模式&#xff1a;使用设备flannel.0进行封包解包&#xff0c;不是内核原生支持&#xff0c;上下文切换较大&#xff0c;性能非常差 vxlan模…