C++——STL容器【map和set】

news2024/11/19 3:39:40

在这里插入图片描述

文档:map、set

文章目录

  • 🍯1. 关联式容器
  • 🫖2. set
    • 🍼1. 模板参数
    • 🍼2. 构造函数
    • 🍼3. 修改
    • 🍼4.操作
      • 🥛find
      • 🥛count
      • 🥛lower_bound & upper_bound & equal_range
  • 🍭3. map
    • 🍬1. 模板参数
    • 🍬2. 构造函数
    • 🍬3. insert
    • 🍬4. operator[]
    • image-20230906114657420

🍯1. 关联式容器

前几篇文章中写的STL容器:vectorlistdequeue等都是序列式容器,它们都是线性结构;而mapset都是关联式容器,与序列式容器不同的是,它们里面存储的是<key,value>结构的键值对,这个在数据检索的时候,比序列式容器的效率更高

键值对:

键值对用来表示一一对应的关系结构,key表示键值,value表示与key对应的信息

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

🫖2. set

set是一种key模型,可用于判断元素在不在、元素去重

🍼1. 模板参数

template < class T,                        // set::key_type/value_type
           class Compare = less<T>,        // set::key_compare/value_compare
           class Alloc = allocator<T>      // set::allocator_type
           > class set;

这里的模板参数里面多了一个Compare = less<T>,它的底层是红黑树,可以用来给我们比较大小

🍼2. 构造函数

image-20230906114958645

🍼3. 修改

这些就和之前的容器使用差不多,这里就不再过多赘述了

image-20230906100230529

🍼4.操作

🥛find

iterator find (const value_type& val) const;

如找到了,返回一个它的迭代器

代码示例:

void t_find()
{
	set<int> s;
	s.insert(9);
	s.insert(10);
	s.insert(20);
	s.insert(23);
	s.insert(9);
	s.insert(6);

	auto it = s.find(2);	//搜索树查找
	auto stl_it = std::find(s.begin(), s.end(), 9);	//stl提供的find暴力查找
	if (it != s.end())
		cout << "get it" << endl;
	else
		cout << "error" << endl;

	if (stl_it != s.end())
		cout << "get it" << endl;
	else
		cout << "error" << endl;
	for (auto e : s)
	{
		cout << e << " ";
	}cout << endl;
}

如果用set查找元素,使用set提供的接口即可,如果使用库里面的查找函数,效率会比较低

另外,如果是multiset,其中有多个相同元素,则查找的是第一个中序遍历出现的元素

🥛count

size_type count (const value_type& val) const;

count是统计这个元素出现的多少次,而set只是一个key模型,用处并不是很大,但我们也可以用count来进行元素查找

void t_count()
{
	set<int> s;
	s.insert(9);
	s.insert(10);
	s.insert(20);
	s.insert(23);
	s.insert(9);
	s.insert(6);
	if (s.count(9))
		cout << "get it" << endl;
	else
		cout << "error" << endl;
}

这个主要是为multiset设计的,找相同元素有多少个

🥛lower_bound & upper_bound & equal_range

iterator lower_bound (const value_type& val) const;
iterator upper_bound (const value_type& val) const;
pair<iterator,iterator> equal_range (const value_type& val) const;

lower_boundupper_boundequal_range通常用来找区间

void t_lower_upper_bound()
{
	set<int> s;
	set<int>::iterator itlow, itup;
	for (int i = 0; i < 10; i++)
	{
		s.insert(i * 10);
	}
	for (auto e : s)
	{
		cout << e << " ";
	}cout << endl;
	auto range = s.equal_range(40);
	//[first,secont)
	cout << *range.first << endl;
	cout << *range.second << endl;
	//[35,70]
	itlow = s.lower_bound(35);	//>=35的值
	itup = s.upper_bound(70);	//>70的值
	s.erase(itlow, itup);
	for (auto e : s)
	{
		cout << e << " ";
	}cout << endl;

	//cout << *itlow << endl;
	//cout << *itup << endl;
}

这个equal_range对于set的作用并不大,这个主要是为multiset提供,可以指定删除某个值

void t_multiset()
{
	multiset<int> mt;
	mt.insert(1);
	mt.insert(4);
	mt.insert(2);
	mt.insert(5);
	mt.insert(1);
	mt.insert(9);
	mt.insert(4);
	for (auto e : mt)
	{
		cout << e << " ";
	}cout << endl;
	//如果没有找到,返回一个不存在的区间
	auto range = mt.equal_range(4);
	mt.erase(range.first, range.second);//删除全部的4
	for (auto e : mt)
	{
		cout << e << " ";
	}cout << endl;
}

🍭3. map

map<key,value>模型,接口和set类似

🍬1. 模板参数

template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
           > class map;

相比于set多了一个value,存储值的时候采用的是pair

	pair<const key_type,mapped_type>

key不可修改,value可以修改

🍬2. 构造函数

image-20230906115028843

🍬3. insert

参数列表:

image-20230906102352274

代码示例:

void t_map_insert()
{
	map<string, string> dict;
	pair<string, string> kv1("apple", "苹果");
	pair<string, string> kv2("banana", "香蕉");
	dict.insert(kv1);
	dict.insert(kv2);

	//匿名对象插入
	dict.insert(pair<string, string>("orange", "橙子"));

	//函数模板make_pair C++98	建议使用这个方式
	dict.insert(make_pair("watermelon", "西瓜"));
    //key相同,value不同,不插入不覆盖	只比较key
	dict.insert(make_pair("watermelon", "北瓜"));
	//C++11支持多参数构造函数隐式类型转换
	dict.insert({ "lemon","柠檬" });
}

make_pair函数模板

image-20230906102143819

要遍历这map,不能将迭代器直接解引用,因为它里面存了2个值,这里的排序是按照key的大小进行排序

map<string, string>::iterator it = dict.begin();
while (it != dict.end())
{
	cout << it->first << ":" << it->second << endl;
	it++;
}
//范围for
//值不可修改, map内容较复杂,传引用,减少拷贝
for (const auto& e : dict)
{
	cout << e.first << ":" << e.second << endl;
}

🍬4. operator[]

void t_mapCount()
{
	string arr[] = { "冬瓜","西瓜","南瓜","北瓜","中瓜","西瓜","西瓜","北瓜" };
	map<string, int> countMap;
	for (auto e : arr)
	{
        //通过insert实现
		countMap[e]++;
	}
	//for (auto e : arr)
	//{
	//	map<string, int>::iterator it = countMap.find(e);
	//	if (it == countMap.end())	//没有出现过
	//	{
	//		countMap.insert(make_pair(e,1));
	//	}
	//	else //出现过,统计次数
	//	{
	//		it->second++;
	//	}
	//}
	for (const auto& e : countMap)
	{
		cout << e.first << ":" << e.second << endl;
	}
}

这里的[]不再像之前普通的[]

image-20230906112632508

它通过key,返回value,底层调用的insert

image-20230906113537714

  1. key如果在这个树里面,返回pari<树里key所在节点的iterator,false>
  2. key不在树里面,返回pari<key所在节点的iterator,true>

所以[]可以用来进行插入操作或者是统计次数或者修改value

image-20230906114657420

mapset底层都是搜索树,随后会模拟实现,所以此篇文章只做大概的介绍

那么本期分享就到这里,我们下期再见

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

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

相关文章

Increment Selection 插件

Increment Selection 插件实现递增 初次使用 按下快捷键 Alt Shift 鼠标左键向下拖拽 向下拖拽之后&#xff0c;在输入一个数字&#xff0c;比如我这里输入了一个数字1 然后按下快捷键 Ctrl Shift ← 进行选中数字 然后按下快捷键 Ctrl Alt i 建自动递增。 然后鼠标随…

网络是如何进行通信

网络是如何进行通信的 简介 在现代社会中&#xff0c;网络已经成为我们生活中不可或缺的一部分。从上网搜索信息、在线购物到远程工作和社交媒体&#xff0c;我们几乎无时无刻不与网络保持着联系。但是&#xff0c;网络究竟是个什么玩意&#xff0c;它是如何工作的呢&#xf…

MinIO集群模式信息泄露漏洞(CVE-2023-28432)

前言&#xff1a;MinIO是一个用Golang开发的基于Apache License v2.0开源协议的对象存储服务。虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。该漏洞会在前台泄露用户的账户和密码。 0x00 环境配置 …

数字信封技术概论

数字信封技术是一种通过加密手段实现信息保密性和验证的技术&#xff0c;它在保护敏感信息传输过程中得到了广泛应用。本文将详细介绍数字信封技术的原理、实现和应用场景。 一、数字信封技术的原理 数字信封技术是一种将对称密钥通过非对称加密手段分发的方法。在数字信封中…

《C++设计模式》——行为型

前言 行为型模式是对在不同的对象之间划分责任和算法的抽象化。行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 Interpreter(解释器) Template Method(模板方法) Chain of Responsibility(责任链) Command(命令) Iterator(迭代器) Me…

海康NVR(Network Video Recorder)启用SSH过程摸索

文章目录 海康NVR具备的特点启用SSH模式优劣比较启用SSH模式的优势启用SSH模式的坏处 Hik NVR启用SSH功能1&#xff0c;Web登录NVR2&#xff0c;SSH登录NVR SSH shell模式特点SSH shell模式指令作用1&#xff0c;简要帮助“help”可以列出常用的shell指令部分可用shell指令输出…

实现一台电脑登录多个微信账号/一个微信账号在多台电脑登录

一、一台电脑登录多个微信账号 在电脑桌面建立一个txt文档文件。 输入内容: echo off start /d"C:\Program Files\Tencent\WeChat\" WeChat.exe start /d"C:\Program Files\Tencent\WeChat\" WeChat.exe exit 如下图&#xff0c;/d"引号内容写微信安…

KT142C-sop16语音芯片ic的串口指令详细说明_默认9600指令可设

3.1 通讯格式 支持异步串口通讯模式,通过串口接受上位机发送的命令 通讯标准:9600 bps --- 可以发送指令修改&#xff0c;并且记忆&#xff0c;详见3.4.5 数据位 :8 停止位 :1 校验位 :none 流控制 :none 格式&#xff1a;$S VER Len CMD Feedback para1 …

简单便捷的行为验证码,让登录更轻松

前言 在当今数字化的世界里&#xff0c;登录账户已成为我们日常生活中不可或缺的一部分。然而&#xff0c;传统的输入验证码方式却常常给用户带来不必要的繁琐和麻烦。为了解决这一问题&#xff0c;简单便捷的行为验证码应运而生&#xff0c;让登录变得更加轻松。 行为验证码…

TuyaOS Sensor Hub组件介绍

文章目录 Sensor Hub 设计思想分层设计Sensor Hub 层(tdl)Sensor Driver 层(tdd) 传感数据元素类型抽象传感器采集策略 Sensor Hub 对上数据与接口数据结构1. 数据读取的触发模式2. 元素型数据订阅规则3. 数据就绪通知回调4. 传感设备信息 应用接口1. 创建传感器实例2. 启动传感…

vue3路由跳转params传参接收不到

import { useRouter } from "vue-router";const router useRouter(); // 提现记录 const withdrawalClick (item) > {router.push({ name: "Devwithdrawal", params: { name: 123 } }); };//跳转页面接收参数 import { useRoute } from "vue-rou…

指针和字符数组笔试题及其解析(第二组)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 数组名在寻常情况下表示首元素地址&#xff0c;但有两种情况例外&#xff1a; 1.sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff0c;这里的…

OLED透明屏模块:引领未来显示技术的突破

OLED透明屏模块作为一项引领未来显示技术的突破&#xff0c;以其独特的特点和卓越的画质在市场上引起了广泛关注。 根据行业报告&#xff0c;预计到2025年&#xff0c;OLED透明屏模块将占据智能手机市场的20%份额&#xff0c;并在汽车导航系统市场中占据30%以上份额。 那么&am…

TD3算法

TD3算法 全称Twin Delayed DDPG&#xff0c;是对DDPG算法的继承、发展和改进&#xff0c;论文 改进如下&#xff1a; T w i n \mathcal{T}win Twin&#xff1a;使用了两个critic来评估actor的动作价值&#xff0c;对应两个critic target&#xff0c;一个actor target&#xff0…

[漏洞复现] metinfo_6.0.0_file-read(任意文件读取)

文章目录 漏洞描述漏洞等级影响版本漏洞复现基础环境漏洞点第一次测试第二次测试第三次测试第四次测试深度利用EXP编写EXP使用案例漏洞挖掘指纹信息修复建议 本次漏洞复现仅供学习使用&#xff0c;如若非法他用&#xff0c;与平台和本文作者无关&#xff0c;需自行负责&#xf…

Solidity 小白教程:10. 控制流,用 solidity 实现插入排序

Solidity 小白教程&#xff1a;10. 控制流&#xff0c;用 solidity 实现插入排序 这一讲&#xff0c;我们将介绍solidity中的控制流&#xff0c;然后讲如何用solidity实现插入排序&#xff08;InsertionSort&#xff09;&#xff0c;一个看起来简单&#xff0c;但实际上很容易…

系统架构设计师(第二版)学习笔记----计算机系统基础

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----计算机系统基础 文章目录 一、计算机硬件1.1 计算机硬件的组成1.2 处理器指令集1.3 处理器层次1.4 总线分类1.5 接口的种类 二、计算机操作系统2.1 计算机软件分类2.2 操作系统的作用2.3 操作系统的特征2…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述

【FusionInsight 迁移】HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述 HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述迁移范围迁移前的准备HDFS文件检查确认HBase迁移目录确保数据落盘停止老集群HBase服务停止新集群HBase服务 HBase从C50迁移到6.5.1&a…

L1-063 吃鱼还是吃肉(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a; 本系列题使用的是&#xff0c;“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度&#xff0c;…

如何在opensuse build service (obs)打包deb包用于分发各个发行版

1.打开网页 https://build.opensuse.org/ 注册账号 创建home project 创建项目 需要配置需要打包的镜像如debian12 ubuntu等 先配置整体home仓库的全部 ​由于是home的&#xff0c;可能不同的项目有些不需要&#xff0c;可以在项目中禁用一些&#xff0c;再配置某个项目需要…