C++ set和map使用

set和map

  • 1.关联式容器
  • 2. 键值对
  • 3. set
    • 3.1 介绍
    • 3.2 简单使用
  • 4.multiset
  • 5.map
    • 5.1 介绍
    • 5.2 简单使用
  • 6. multimap

1.关联式容器

在这里插入图片描述

关联式容器是一种STL容器,用于存储键-值对。它们提供了一种通过键来快速查找值的机制。STL总共实现了两种不同结构的管理式容器:树型结构(map、set、multimap、multiset)与哈希结构。在关联式容器中,里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高.

2. 键值对

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

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)
	{}
};

3. set

3.1 介绍

  1. set的底层是二叉搜索树(红黑树)。
  2. set中的数据是有序去重的。
  3. set中的数据是被const修饰的,所以不能修改,但是可以插入和删除。
  4. set默认的排序是按照从小到大的。如果想要按照自己的想法排序,需要自己写一个仿函数。
  5. 和map不同的是,set底层的键值对不是<key,value>而是<value,value>。
  6. set容器查找效率很高,时间复杂度为O(log2 N)

3.2 简单使用

  1. begin()    返回set容器的第一个元素
  2. end()      返回set容器的最后一个元素
  3. clear()    删除set容器中的所有的元素
  4. empty()    判断set容器是否为空
  5. insert()    插入一个元素
  6. size()      set容器内元素个数
  7. clear()    清空容器
int main()
{
	//去重加排序
	set<int> s;
	s.insert(10);
	s.insert(10);
	s.insert(1);
	s.insert(20);
	s.insert(20);
	s.insert(8);
	s.insert(5);
	cout << s.size() << endl;
	set<int>::iterator it = s.begin();
	while (it != s.end())
		cout << *it++ << " ";
	cout << endl;
	s.clear();
	cout << s.size();
	return 0;
}

在这里插入图片描述

  1. count()
    用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了
void test2()
{
	set<int> s;
	s.insert(10);
	s.insert(10);
	s.insert(1);
	s.insert(20);
	s.insert(20);
	s.insert(8);
	s.insert(5);
	cout << "10的个数:" << s.count(10) << endl;
	cout << "5的个数:" << s.count(5) << endl;
	cout << "100的个数:" << s.count(100) << endl;
	if (s.count(10))
	{
		//do...
	}
}

在这里插入图片描述

      erase(iterator)       删除迭代器iterator指向的值

      erase(first,second)       删除迭代器first和second之间的值

      erase(key_value)       删除键值key_value的值
注:前两个必须保证迭代器有效,不然程序会崩溃,最后一个,不管值存不存在都可以

void test3()
{
	set<int> s;
	set<int>::const_iterator iter;
	set<int>::iterator first;
	set<int>::iterator second;
	for (int i = 1; i <= 10; ++i)
		{
		    s.insert(i);
		}
	//第一种删除
		s.erase(s.begin());
	//第二种删除
	first = s.begin();
	second = s.begin();
	second++;
	second++;
	s.erase(first, second);
	//第三种删除
		s.erase(8);
	cout << "删除后 set 中元素是 :";
	for (iter = s.begin(); iter != s.end(); ++iter)
	{
		cout << *iter << " ";
	}
	cout << endl;
	
}

在这里插入图片描述

    lower_bound(key_value)       返回第一个大于等于key_value的迭代器
    upper_bound(key_value)      返回最后一个大于key_value的迭代器
这两个函数也可以用于于删除一个区间的数据。

void test4()
{
	set<int> s;
	s.insert(5);
	s.insert(1);
	s.insert(6);
	s.insert(3);
	s.insert(4);

	auto start = s.lower_bound(3);  // >=val
	cout << *start << endl;

	auto finish = s.upper_bound(5);  // >val
	cout << *finish << endl;
	

	while (start != finish)
	{
		cout << *start << " ";
		++start;
	}
	cout << endl;
}

在这里插入图片描述

4.multiset

该容器允许键值重复,其他的使用和set差不多。这样count()的作用就显现出来了。还有一个不同的是find()返回的是中序遍历的第一个。

5.map

5.1 介绍

  1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。
  2. 在map中,键值key通常用于排序和唯一的标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair: typedef pair<const key, T> value_type;
  3. 在内部,map中的元素总是按照键值key进行比较排序(默认升序)的。
  4. 和set一样key不允许修改,但是key所关联的value可以修改。
  5. map支持下标访问符(set不支持),即在[]中放入key,就可以找到与key对应的value。
  6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))

5.2 简单使用

map的使用和set的使用基本是差不多,但是map的[]运算符使用起来还是很方便的,下面就简单介绍几种。

  1. 插入数据的几种方法:
//1.直接insert pair
map<string,int> m;
m.insert(pair<string,int>("apple",1));

 

//2. 直接insert value_type 其实本质和第一种方式一样
map<string,int> m;
m.insert(map<string,int>::value_type("apple",1));

 

//3. 使用[]运算符,这种是最简便的方法
map<string,int> m;
m["apple"] = 1;
  1. 修改数据
//如果数据原本不存在,就相当于插入操作
map<string,int> m;
m["apple"]++;
  1. 查找数据
map<string,int> m;
if(m["apple"])
cout << m[apple] << endl;

6. multimap

和map不同的是,multimap允许有重复的key值,但这同时也导致了multimap没有[]这个运算符,因为会导致二义性。

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

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

相关文章

编写dockerfile挂载卷、数据容器卷

编写dockerfile挂载卷 编写dockerfile文件 [rootwq docker-test-volume]# vim dockerfile1 [rootwq docker-test-volume]# cat dockerfile1 FROM centosVOLUME ["volume01","volume02"]CMD echo "------end------" CMD /bin/bash [rootwq dock…

ecmascript 6+(2)

引用数据类型&#xff1a; Object, Array, RegExp, Date等 包装类型&#xff1a;&#xff08;底层数据类型会将简单数据类型包装为对象&#xff09; String, Number, Boolean等&#xff08;都是基本数据类型的构造函数&#xff09; Object Object.keys(对象) 返回数组&…

4款塞纸条盲盒交友源码,可以对接公众号

一元盲盒交友源码/脱单盲盒源码/交友盲盒/恋爱盲盒公众号版 可以对接自己支付&#xff0c;全部自定义 没有任何bug版本&#xff0c;已经测试完全可以 免费源码&#xff0c;不包搭建指导 源码下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

flink重温笔记(九):Flink 高级 API 开发——flink 四大基石之WaterMark(Time为核心)

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 9 天啦&#xff01;学习了 flink 四大基石之 Time的应用—> Watermark&#xff08;水印&#xff0c;也称水位线&#xff09;&#xff0c;主要是解决数据由于网络延迟问题&#xff0c;出现数据乱序或者迟到数据现象&…

Vue项目的快速搭建

Vue项目的快速搭建 一、下载并安装node.js二、安装Vue脚手架三、创建vue项目四、项目启动五、VS Code下载安装 一、下载并安装node.js 首先确保已经安装了Node.js。如果没有安装&#xff0c;可以去官网&#xff08;https://nodejs.org/&#xff09;下载并安装最新版本的Node.j…

CIP通讯介绍(欧姆龙PLC)

什么是CIP CIP通信是Common Industrial Protocl(CIP)的简称&#xff0c;它是一个点到点的面向对象协议&#xff0c;能够实现工业器件&#xff08;传感器&#xff0c;执行器&#xff09;之间的连接&#xff0c;和高等级的控制器之间的连接。目前&#xff0c;有3种网络DeviceNet…

c语言经典测试题9

1.题1 #include <stdio.h> int main() { int i 1; sizeof(i); printf("%d\n", i); return 0; } 上述代码运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;其实这题的难点就是sizeof操作后i的结果是否会改变&#xff0c;首先我们创建了一个整型i&a…

消息中间件之RocketMQ源码分析(二十七)

Broker提交或回滚事务消息 当生产者本地事务处理完成并且Broker回查事务消息后&#xff0c;不管执行Commit还是Rollback,都会根据用户本地事务的执行结果发送一个End_transaction的RPC请求给Broker&#xff0c;Broker端处理该请求的类是EndTransactionProcessor 第一步&…

记录github中那个是正常的文件下载的方式,idm正确的使用方式

百度网盘下载速度 文件说明 后缀 tar.gz 是linux 文件 zip 是 压缩文件不知道是哪个压缩文件 github 中的文件难下载 刚才我下载的时间是10.05出现了文件中断的清空 无法下载 第一个文件下载好的样子 还是用这个良心 20230924-1DM脚本激活 下载完成没有说怎么使用 我之前使用…

用python和pygame库实现刮刮乐游戏

用python和pygame库实现刮刮乐游戏 首先&#xff0c;确保你已经安装了pygame库。如果没有安装&#xff0c;可以通过以下命令安装&#xff1a; pip install pygame 示例有两个。 一、简单刮刮乐游戏 准备两张图片&#xff0c;一张作为背景bottom_image.png&#xff0c;一张作…

【详识JAVA语言】数组练习

数组转字符串 代码示例 import java.util.Arraysint[] arr {1,2,3,4,5,6};String newArr Arrays.toString(arr);System.out.println(newArr);// 执行结果 [1, 2, 3, 4, 5, 6] 使用这个方法后续打印数组就更方便一些. Java 中提供了 java.util.Arrays 包, 其中包含了一些操…

Nacos 2.3.0 安装配置详细流程(2.x.x版本基本都适用)

目录 1. 下载Nacos2. Nacos启动前的准备3. 可选&#xff1a;开启登录验证4. 启动服务器 1. 下载Nacos Nacos 2.3.0 Windows安装包下载地址&#xff1a;点击下载 其他版本下载&#xff1a;https://github.com/alibaba/nacos/releases 2. Nacos启动前的准备 创建数据库&#…

大小端问题

0. 介绍 大小端计算机存储数据而安排字节的两种顺序。 针对的是字节。 大端与我们平时书写的顺序一致。 1. 大小端的判定 不需要手动判断。 有一个头文件endian.h; 可能会有宏 __BYTE_ORDER __BIG_ENDIAN __LITTLE_ENDIAN通过库来进行判断。 手动判断 根据字节存取的顺序…

Shell输入输出重定向

Linux Shell 重定向分为两种&#xff0c;一种输入重定向&#xff0c;一种是输出重定向。其实输入输出方向就是数据的流动方向&#xff1a; 输入方向&#xff1a;就是数据从哪里流向程序。数据默认从键盘流向程序&#xff0c;如果改变了它的方向&#xff0c;数据就从其它地方流…

LLM 系列——BERT——论文解读

一、概述 1、是什么 是单模态“小”语言模型&#xff0c;是一个“Bidirectional Encoder Representations fromTransformers”的缩写&#xff0c;是一个语言预训练模型&#xff0c;通过随机掩盖一些词&#xff0c;然后预测这些被遮盖的词来训练双向语言模型&#xff08;编码器…

最新 Node 初始化 vue 项目报错(npm init vue@latest)以及配置淘宝镜像(cnpm)

最新 Node 初始化 vue 项目报错&#xff08;npm init vuelatest&#xff09;以及配置淘宝镜像&#xff08;cnpm&#xff09; PS E:\SpringBootBase\ProjectOne\big-event-vue> cnpm init vuelatest cnpm : The term ‘cnpm’ is not recognized as the name of a cmdlet, fu…

加密隧道技术

在现在的互联网上传输数据&#xff0c;首要考虑的就是安全。这关乎到你的隐私&#xff0c;个人信息&#xff0c;财产安全等等重大问题。如果你的程序本身传输的信息没有加密&#xff0c;也可以通过其他辅助方式让你的通信加密。一些工具的就是为了解决这样的场景的&#xff0c;…

文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题

三、设计 LCS-LENGTH的带备忘的版本&#xff0c;运行时间为O(mn)。需要写代码的时候&#xff0c;请用go语言。 文心一言&#xff0c;代码正常运行&#xff1a; LCS-LENGTH&#xff08;Longest Common Subsequence Length&#xff09;问题的带备忘的版本通常指的是使用动态规划…

springboot+vue学生网上请假系统

学生网上请假系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了学生网上请假系统的开发全过程。通过分析学生网上请假系统管理的不足&#xff0c;创建了一个计算机管理学生网上请假系统的方案。文章介绍了…

社区店经营全攻略:为何成为创业者的首选?

在当今的创业环境中&#xff0c;社区店越来越受到创业者的关注和青睐。 作为一名开鲜奶吧5年的创业者&#xff0c;我见证了无数的实体项目&#xff0c;这篇文章&#xff0c;为大家深入解析社区店的优势&#xff0c;以及为何它成为了众多创业者的首选。 社区店的主要优势在于以…