STL中set与map介绍

news2024/12/23 11:34:35

目录

  • 一. 键值对
    • 1. 关联式容器
    • 2. pair
    • 3. 应用场景
  • 二. set
    • 1. set的介绍
    • 2. set的使用
    • 3. multiset的介绍
  • 三. map
    • 1. map的介绍
    • 2. map的使用
    • 3. multimap的介绍

一. 键值对

​ 用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value。key代表键值,value表示与key对应的信息

1. 关联式容器

  • 序列式容器:如vector、list等,其底层为线性序列的结构,存储的数据是元素本身
  • 关联式容器:存储的是<key, value>的键值对,利于进行数据检索。

2. pair

在库中已经实现好的结构,SGI-STL中关于键值对的定义:

template <class T1, class T2>
struct pair
{
    typedef T1 first_type;
    typedef T2 second_type;
    
    T1 first;
    T2 second;
    
    pair()
        : first(T1())
        , second(T2())
    {}
    
    pair(const T1& a, const T2& b)
        : first(a)
        , second(b)
    {}
};

其含有两个成员对象,first对应key、second对应value

库中定义了make_pair()函数,可以方便创建pair对象,该函数模板会根据传入参数类型进行自动隐式推导,构造并返回一个的pair对象。

template <class T1, class T2>
pair<T1, T2> make_pair(T1 x, T2 y)
{
	return (pair<T1, T2>(x, y));
}

3. 应用场景

  • 树型结构:如map、set、multimap、multiset,使用红黑树作为底层结构。
  • 哈希结构:如unordered_set、unordered_map,使用哈希表作为底层结构。

二. set

1. set的介绍

set使用文档
在这里插入图片描述

T:set中存放的元素类型,

Compare:set元素的比较方式,默认按小于来比较

Alloc:set元素空间的管理方式,使用STL提供的空间配置器管理

  • set是按照一定次序存储元素的容器,元素按照其比较对象(class Compare)所规定的规则进行排序
  • 默认按照小于(less< T>)来进行比较,迭代遍历,可以得到有序序列。
  • 在set中,元素的value(类型为T)是唯一的,不会重复。不能修改value,但是可以从容器中删除再插入
  • set元素中数据value只有一个类型T,但其底层实际存放的是由<value, value>构成的键值对(底层由红黑树实现)

2. set的使用

void testSet()
{
	int a[] = { 1,2,3,4,2023,1,9,3,50 };
	int size = sizeof(a) / sizeof(a[0]);
	//排序+去重
	set<int> s(a, a + size);

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;

	s.erase(9);
	s.erase(2023);
	
	for (int i = 0; i < size; ++i)
	{
		if (s.find(a[i]) == s.end())//没找到返回s.end()
		{
			cout << a[i] << " 被删除了" << endl;
		}
	}
}

在这里插入图片描述

3. multiset的介绍

multiset使用文档
在这里插入图片描述

与set基本一样,其中区别在于:multiset容器中允许重复元素存在

void testSet()
{
	int a[] = { 1,2,3,4,2023,1,9,3,50 };
	int size = sizeof(a) / sizeof(a[0]);
	//排序+不去重
	multiset<int> s(a, a + size);

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
}

在这里插入图片描述

三. map

1. map的介绍

map使用文档
在这里插入图片描述

key:键值对中key的类型

T:键值对中value的类型

Compare:比较对象,默认按照元素中的key的小于进行比较

Alloc:使用STL提供的空间配置器管理

  • map中元素是键值对,其中key是唯一的,不能重复,不能修改
  • 用迭代器遍历,可以得到一个有序序列
  • 支持"[]"下标访问操作符,在[]中放入key,就可以访问对应的value

2. map的使用

void testMap()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
	map<string, int> countMap;
	for (auto& str : arr)
	{
		map<string, int>::iterator it = countMap.find(str);
		if (it != countMap.end())
		{
			//(*it).second++;
			it->second++;
		}
		else
		{
			countMap.insert(make_pair(str, 1));
		}
	}
    
	//for (auto& str : arr)
	//{
	//	// 1、str不在countMap中,插入pair(str, int()),然后在对返回次数++
	//	// 2、str在countMap中,返回value(次数)的引用,次数++;
	//	countMap[str]++;
	//}
    
	map<string, int>::iterator it = countMap.begin();
	while (it != countMap.end())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}
}

在这里插入图片描述

3. multimap的介绍

multimap使用文档
在这里插入图片描述

multimap和map也相似,不同点:multimap中的Key是可以重复的;没有operator[],因为key可能对应多个value。

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

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

相关文章

Draw.io 高阶用法

drawio是一款非常不错画流程图的软件&#xff0c;而且是免费的&#xff0c;但大部分图形以2D为主&#xff0c;有时候 却需要一些3D效果来增强方案 举个例子&#xff1a; 需要变成这样&#xff0c;看起来更3D 方法&#xff1a; 先拖入一个圆形&#xff0c;把限制比例去掉&a…

【C数据结构】队列_Queue

目录 队列_Queue 【1】队列的概念及结构 【2】节点队列的实现 【2.1】队列的各个接口 【2.2】队列的初始化 【2.3】队列栈的释放 【2.4】队尾入队列 【2.5】队头出队列 【2.6】获取队列头部元素 【2.7】获取队列尾部元素 【2.8】获取队列中有效元素个数 【2.9】检测…

图像 检测 - CenterNet: Objects as Points (arXiv 2019)

CenterNet: Objects as Points - 目标作为点&#xff08;arXiv 2019&#xff09; 摘要1. 引言2. 相关工作3. 准备工作4. 目标作为点4.1 3D 检测4.2 人体姿态估计 5. 实施细节6. 实验6.1 目标检测6.1.1 附加实验 6.2 3D 检测6.3 姿态估计 7. 结论References附录A&#xff1a;模型…

Nginx安装Windows、Linux | 正向代理、反向代理、负载均衡

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可用作电子邮件代理服务器和通用TCP/UDP代理服务器。它是一个轻量级的Web服务器&#xff0c;可以作为静…

[进阶]Java:线程概述、线程创建方式

什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。程序中如果只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 多线程是什么&#xff1f; 多线程是指从软硬件上…

【现代数据架构】面向初创公司的现代数据堆栈

“为工作使用正确的工具&#xff01;” 这句话一开始听起来很简单&#xff0c;但在实际方面实施起来却非常复杂。早期的初创公司发现很难选择生态系统中可用的各种工具&#xff0c;因为它们的数据将如何演变是非常不可预测的。 需要现代数据堆栈 在过去 10 年中&#xff0c;软件…

c++11 标准模板(STL)(std::basic_ios)(四)

定义于头文件 <ios> template< class CharT, class Traits std::char_traits<CharT> > class basic_ios : public std::ios_base 类 std::basic_ios 提供设施&#xff0c;以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios…

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容 VMware 支持的 OpenStack 发行版&#xff1a;在 VMware 虚拟化技术之上运行企业级 OpenStack 云 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vio-7/&#xff0c;查看最新版。原创…

极易搭建的代码托管平台Gitea

这礼拜有点霉啊&#xff0c;先是日常自用的机器上&#xff0c;SSD 挂了&#xff0c;彻底识别不了的那种 隔了两天&#xff0c;用来写文章用的小机器上&#xff0c; 500G 的机械硬盘也挂了&#xff0c;重新格了一下&#xff0c;挂在玩客云上当个下载盘用吧 好在都有备份&#xf…

[进阶]Java:文件字节输出流、文件拷贝、资源释放

文件字节输出流&#xff08;FileOutputStream&#xff09;写数据出去的API 流的关闭和刷新 代码演示如下&#xff1a; ​​​​​​​ public class OutputStreamDemo04 {public static void main(String[] args) throws Exception {//1.创建一个文件字节输出流管道与目标文件…

WPF开发txt阅读器14:通过C#代码设计UI布局

文章目录 需求分析C#代码UI设计 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进快退&#x1f48…

ad18学习笔记六:ad18官方在线文档

这个挺有用&#xff0c;反正我是没找到离线的、完整的、详细的软件说明文档&#xff0c;只有去官网看在线的&#xff0c;有点卡&#xff0c;还是全英文的。 具体的位置直接进官网&#xff0c;比如这个&#xff1a; Board Region | Altium Designer 18.0 User Manual | Docume…

BOSHIDA AC DC电源模块在光纤通信设备的应用

BOSHIDA AC DC电源模块在光纤通信设备的应用 随着科技的不断发展&#xff0c;光纤通信技术逐渐成为人们日常生活和工作中广泛采用的一项技术。在光纤通信设/备中&#xff0c;稳定的电源模块是其正常运转的关键。AC DC电源模块在光纤通信设/备的应用也越来越广泛。 AC DC电源模…

清华青年AI自强作业hw3_1:用线性回归模型拟合MNIST手写数字分类

清华青年AI自强作业hw3_1&#xff1a;用线性回归模型拟合MNIST手写数字分类 实现过程思路分析逻辑回归二分类模型训练结果分析 相关链接 一起学AI系列博客&#xff1a;目录索引 hw3_1&#xff1a;用线性回归模型拟合MNIST手写数字分类 初步体验Tensorflow编程环境体会用回归模…

HDLBits自学笔记2:Verilog language.Vector

Vectors 建立一个电路&#xff0c;有一个3bit输入&#xff0c;输出这个向量&#xff0c;并将其分割为三个单独的1bit信号输出&#xff0c;电路图如下&#xff1a; module top_module ( input wire [2:0] vec,output wire [2:0] outv,output wire o2,output wire o1,output wir…

【30天熟悉Go语言】8 Go流程控制之循环结构for range、goto、break、continue

文章目录 一、前言二、for循环1、语法1&#xff09;和Java的for循环一样2&#xff09;和Java的while一样3&#xff09;和Java的for(;;)一样 2、for语句执行过程 三、for range1、语法1&#xff09;遍历key、value只遍历value 2&#xff09;遍历key 四、关键字1、break1&#xf…

【Rust日报】2023-06-18 2023第三届中国Rust开发者大会圆满结束

2023第三届中国Rust开发者大会 发布 Mailtutan v0.3.0 - 用于测试和开发环境的 SMTP 服务器 变更日志&#xff1a; 添加数据修剪支持添加邮件目录存储向 API 添加删除消息添加 TLS 支持添加 SMTP 普通身份验证支持 github: https://github.com/mailtutan/mailtutan/ Kani 0.30.…

测试工程师个人简历模板

测试工程师个人简历模板篇1 姓 名&#xff1a; _x 性 别&#xff1a; 男 婚姻状况&#xff1a; 已婚 民 族&#xff1a; 汉族 户 籍&#xff1a; 湖南-岳阳 年 龄&#xff1a; 27 现所在地&#xff1a; 广东-深圳 身 高&#xff1a; 176cm 希望地区&#xff1a; 广东、 广…

Q-learning解决悬崖问题

Q-learning是一个经典的强化学习算法&#xff0c;是一种基于价值(Value-based)的算法&#xff0c;通过维护和更新一个价值表格(Q表格)进行学习和预测。 Q-learning是一种off-policy的策略&#xff0c;也就是说&#xff0c;它的行动策略和Q表格的更新策略是不一样的。 行动时&am…

vue2和vue3组件v-model区别

前言 单向数据流&#xff0c;父组件传给子组件的数据&#xff0c;子组件只能展示&#xff0c;不能修改&#xff0c;如果需要修改则需要emit事件让父组件修改 有些时候&#xff0c;一些组件并不是通过input来进行触发事件。也就是说value和input事件在大多数情况下能够适用&am…