「C++」map和set的使用介绍

在这里插入图片描述

💻文章目录

  • 📄前言
  • 前置知识
    • 关联式容器
    • 键值对
    • map和set的底层结构
  • set
    • set的构造函数
    • set 的修改操作
    • set的使用
  • map
    • map的函数
    • map的使用
  • multiset 和 multimap
  • 📓总结


📄前言

stl容器分为两类,分别是序列容器和关联式容器,学习关联式容器可以帮助我们去解决去重等问题。

前置知识

在介绍set和map前,我们必须拥有一些必备的知识储备,比如像关联式容器与键值对等基础知识。

关联式容器

stl容器分为两类,分别是序列容器和关联式容器.

  • 序列式容器:像vector、list、deque等容器就是序列式容器。
  • 关联式容器:也可以用于存储数据,但在数据检索上比序列式容器高。

键值对

键值对指的是一种映射关系,这种结构拥有两个变量<key, value>,生活中也存在许多这样的键值对,比如你的身份证对应着你、英文的单词对应的意义。

map和set的底层结构

STL中的关联式结构有两种结构组成:树型结构(红黑树)和哈系结构,而map和set都是使用树型结构所构成的。

set

set 虽然只允许插入一个数值value,但其内部的实现还是键值对<value, value>,而且因为其允许冗余数据(重复数据),所以set还经常用于去重。

set的构造函数

函数接口说明
set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());构造空的set
set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());使用迭代器构建set
set (const set& x);拷贝构造

set 的修改操作

函数功能说明
pair<iterator, bool> insert(const, value_type& x )插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中存在,返回<x在set的位置,false>
void erase(iterator position)删除set中position位置的节点
size_type erase( const key_type& x)删除set中值为x的元素,返回删除的元素的个数
void swap( set& x)交换两个set中的元素。
void clear()将set中的元素清空
void erase(iterator first, iterator last)删除set中(first, last)区间的元素
iterator find(const key_type& x) const返回值为x的迭代器
size_t count(const key_type& x)返回元素x出现的次数

set的使用

现在来看看使用的方式吧。

void test()
{
	vector<int> nums{1,2,3,4,3,4,5,6,7,8,9};
	//利用迭代器进行构造
	set<int> st(nums.begin(), nums.end());
	for(auto& key : st)
	{	//迭代器进行遍历
		cout << key << " ";
	}
	cout << endl;
	for(auto it = st.rbegin(); it != st.rend(); ++it)
	{	//反迭代器进行遍历
		cout << *it << " ";
	}
    cout << endl;
	cout << "st.count(): " << st.count(4) << endl;
}

在这里插入图片描述

map

map与set不同的是map是使用<key,value>的键值对,key可以唯一的标识value。

在这里插入图片描述

map的函数

map所拥有的函数基本和set保持一致,所以这里只介绍不同的地方

map
operator[ ]返回key对应的value
at()返回key对应的value

注意:operator[ ]和at()都是返回key对应的value的引用,但如果key不存在,operator[]会用默认key与value构建键值对并插入,返回这默认value,at()则直接抛出异常。

map的使用

void test()
{
    map<string, string> dict;
	dict.insert(make_pair("insert", "插入"));
	dict.insert(make_pair("erase", "删除"));
	dict.insert(make_pair("left", "左边"));
	dict.insert(make_pair("string", "字符串"));
	string str;
	while (cin>>str)	//查找单词
	{
		auto ret = dict.find(str);		//查找成功返回iterator position,失败返回end();
		if (ret != dict.end())
		{
			cout << str << ":" << ret->second << endl;
		}
		else
		{
			cout << "单词拼写错误" << endl;
		}
	}

	string strs[] = { "苹果", "西瓜", "苹果", "樱桃", "苹果", "樱桃", "苹果", "樱桃", "苹果" };
    map<string, int> m;
    for(auto& it : strs)
    {
        m[it]++;		//如果map中没有该key则创建一个
    }

    for(auto& it : m)
        cout << it.first << ":" << it.second << endl;
}

在这里插入图片描述

multiset 和 multimap

multiset和multimap 与其原生版本不同的是multi版本可以允许重复数据的存在,其接口和原生版本没有区别,但multimap和map除外,multimap没有了operator[]的接口。

📓总结

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

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

相关文章

Java 高等院校分析与推荐系统

1&#xff09;项目简介 随着我国高等教育的大众化&#xff0c;高校毕业生就业碰到了前所未有的压力&#xff0c;高校学生就业问题开始进入相关研究者们的视野。在高校学生供给忽然急剧增加的同时&#xff0c;我国高校大学生的就业机制也在发生着深刻的变化&#xff0c;作为就业…

操作系统:进程(一)

进程的基本概念 一般的解释是&#xff1a;进程是程序的一个执行实例&#xff0c;是正在执行的程序。我们写的程序编译后是一段二进制的文件。启动的时候加载到系统里面执行&#xff0c;就是以进程的形式执行。也就是说&#xff0c;我们编译后的可执行程序是一个静态的概念&…

C++ STL之string初始

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

JSP基本表单和Request对象使用例子

表单的jsp&#xff1b; <%page contentType"text/html;charsetgbk" pageEncoding"UTF-8"%> <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><titl…

golang学习笔记——接口interfaces

文章目录 Go 语言接口例子空接口空接口的定义空接口的应用空接口作为函数的参数空接口作为map的值 类型断言接口值 类型断言例子001类型断言例子002 Go 语言接口 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具…

数据库大事记

数据库分类分类方法为&#xff1a;按数据模型分类、按业务类型分类、按部署方式分类、按存储介质分类。 按数据模型分类 按业务类型分类 按部署方式分类 按存储介质分类 喜欢点赞收藏&#xff0c;下期再见。

【Redux】Redux 基本使用

1. Redux 快速上手 Redux 是 React 最常用的集中状态管理工具&#xff0c;类似于Vue中的Pinia&#xff08;Vuex&#xff09;&#xff0c;可以独立于框架运行。 <button id"decrement">-</button> <span id"count">0</span> <…

多线程Thread(初阶一:认识线程)

目录 一、引用线程的原因 二、线程的概念 三、进程和线程的区别 四、多线程编程 一、引用线程的原因 多任务操作系统&#xff0c;希望系统能同时运行多个任务。所以会涉及到进程&#xff0c;需要对进程进行管理、调度等。 而单任务操作系统&#xff0c;就完全不涉及到进程…

YOLOv8-Seg改进策略:全新的聚焦式线性注意力模块Focused Linear Attention | ICCV2023

🚀🚀🚀本文改进:深入分析了现有线性注意力方法的缺陷,并提出了一个全新的聚焦的线性注意力模块(Focused Linear Attention),同时具有高效性和很强的模型表达能力。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,…

深度学习系列53:mmdetection上手

1. 安装 使用openmim安装&#xff1a; pip install -U openmim mim install "mmengine>0.7.0" mim install "mmcv>2.0.0rc4"2. 测试案例 下载代码和模型&#xff1a; git clone https://github.com/open-mmlab/mmdetection.git mkdir ./checkpoi…

2023年【熔化焊接与热切割】考试试卷及熔化焊接与热切割试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试试卷考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割试题及解析题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割模拟考试很简单。 1、【单选题】 对…

React+后端实现导出Excle表格的功能

最近在做一个基于Reactantd前端框架的Excel导出功能&#xff0c;我主要在后端做了处理&#xff0c;这个功能完成后&#xff0c;便总结成一篇技术分享文章&#xff0c;感兴趣的小伙伴可以参考该分享来做导出excle表格功能&#xff0c;以下步骤同样适用于vue框架&#xff0c;或者…

“轻松实现文件夹批量重命名:使用顺序编号批量改名“

你是否曾经遇到过需要批量重命名文件夹&#xff0c;却因为繁琐的手动操作而感到困扰&#xff1f;现在&#xff0c;我们为你带来了一款全新的工具——轻松实现文件夹批量重命名&#xff0c;使用顺序编号批量改名。这款工具将帮助你轻松解决文件夹重命名的问题&#xff0c;提高工…

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08 这个功能大家还熟悉么&#xff1f;我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我&#xff01;&#xff01;&#xff01;不是让大家记住我哈。 值得一提的是&#xff0c;Spring Security 也提供了这个…

2023年汉字小达人市级比赛在线模拟题更新:40分钟150题完整对标

今天是2023年11月19日&#xff0c;距离11月30日的汉字小达人市级比赛还有11天。许多孩子正在利用难得的周末抓紧练习和备赛。 结合一些孩子的反馈和需求&#xff0c;我把150题的在线模拟题做了更新&#xff0c;增加了前面的个人信息填写的部分&#xff0c;并且把整个试卷的完成…

python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)

省流建议 本文针对以下需求&#xff1a; 想自动化标注一些目标不再想使用yolo想在目标检测/语意分割有所建树计算机视觉项目想玩一玩大模型了解自动化工具了解最前沿模型自定义目标P图替换… 确定好需求&#xff0c;那么我们发车&#xff01; 实现功能与结果 该模型将首先…

python——第九天

今日目标&#xff1a; 偏函数 递归 字符串对象 切片 常见排序和查找 偏函数&#xff1a; python中存在一种函数的特殊使用&#xff0c;称为偏函数 如果在调用某个函数时&#xff0c;恰好某一个或者&#xff0c;某一些参数都是一个固定值&#xff08;正好不是默认值&#xff09;…

Linux常用命令——bye命令

在线Linux命令查询工具 bye 命令用于中断FTP连线并结束程序。。 补充说明 bye命令在ftp模式下&#xff0c;输入bye即可中断目前的连线作业&#xff0c;并结束ftp的执行。 语法 bye实例 bye在线Linux命令查询工具

从0开始学习JavaScript--JavaScript 数字与日期

JavaScript中的数字和日期是处理数值计算和时间相关任务的核心。本文将深入研究JavaScript中数字的表示、常见运算&#xff0c;以及日期对象的创建、格式化等操作&#xff0c;并通过丰富的示例代码&#xff0c;可以更全面地了解和应用这些概念。 JavaScript数字基础 JavaScri…

【RocketMq系列-01】RocketMq安装和基本概念

RocketMq系列整体栏目 内容链接地址【一】RocketMq安装和基本概念https://zhenghuisheng.blog.csdn.net/article/details/134486709 RocketMq安装和基本概念 一&#xff0c;RocketMq安装和基本概念1&#xff0c;RocketMq基本安装(本地安装)2&#xff0c;Rocketmq的核心概念2.1&…