「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.hqwc.cn/news/192611.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文讲明 Spring 的使用 【全网超详细教程】

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 目录结构 Spring 的相关代码 都公开在…

「git 系列」git 如何存储代码的?

这里写自定义目录标题 git 文件存储位置git 数据模型示例分析分析前准备命令哈希值 具体示例 不同版本的提交&#xff0c;git 做了什么工作&#xff1f;snapshot vs delta-based vs backup参考资料 git 文件存储位置 想要了解如何存储&#xff0c;首先需要知道存储位置。 当我…

DHCP协议详解

前言 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;主要有两个用途&#xff1a;给内部网络或网络服务供应商自动分配IP地址&#xff0c;给用户或者内部网络管…

硬件工程师基础能力课

第一课时--基本定理、电阻、电容等 首先了解下面几个概念&#xff0c;基尔霍夫定理&#xff1a;KCL & KVL&#xff0c;叠加定理&#xff0c;戴维南定理&#xff08;电压源等效&#xff09;和诺顿定理&#xff08;电流源等效&#xff09;、奈奎斯特采样定理。 上面说的这些东…

机器视觉工程师吐槽的常见100个名场面

学了后发现真没用&#xff0c;只能越干越多 德创跑的快&#xff0c;苏映视裁的快&#xff0c;上帝说&#xff0c;要有光&#xff0c;我是凌云光。 这群里面有多少从德创跑路的 去年我辛辛苦苦干一年顶两年了&#xff0c;单双休变单休或者无休&#xff0c;节假日全部对半砍。加班…

选硬币该用动态规划

选硬币&#xff1a; 现有面值分别为1角1分&#xff0c;5分&#xff0c;1分的硬币&#xff0c;请给出找1角5分钱的最佳方案。 #include <iostream> #include <vector>std::vector<int> findChange(int amount) {std::vector<int> coins {11, 5, 1}; /…

Sa-Token 整合Java17和SpringBoot

目录 前言引入项目开启登录认证路由拦截鉴权解决兼容问题总结 前言 之前无意中发现Sa-Token权限认证框架&#xff0c;项目十分好用。 项目地址&#xff1a; https://github.com/dromara/sa-token 官网地址&#xff1a; https://sa-token.cc/doc.html#/start/example 我的个人…

【vue实战项目】通用管理系统:首页

前言 本文为博主的vue实战小项目系列中的第三篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装to…

2023年中职“网络安全“—Web 渗透测试②

2023年中职“网络安全“—Web 渗透测试② Web 渗透测试任务环境说明&#xff1a;1.访问http://靶机IP/web1/,获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b;2.访问http://靶机IP/web2/,获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b;3.访问http://靶机IP/web…

通过bat脚本控制Oracle服务启动停止

1、将Oracle服务全部设置为手动启动 初始安装Oracle之后服务启动状态&#xff1a; 2、服务功能介绍 3、构建服务启动/停止bat脚本 注意&#xff1a;编码选择ANSI(如果编码不是ANSI运行脚本会显示乱码) echo off :main cls echo 当前Oracle服务状态&#xff1a; for /f &quo…

开源情报 (OSINT)

开源情报 (OSINT)是出于情报目的收集和分析公开数据的行为。 什么是开源数据&#xff1f; 开源数据是公众容易获得或可根据要求提供的任何信息。 OSINT 来源可包括&#xff1a; ▶ 报纸杂志文章以及媒体报道▶ 学术论文和发表的研究▶ 书籍和其他参考资料▶ 社交媒体活动▶…

Java20新增特性

版本介绍 Java 20是在2023年3月21日发布的&#xff0c;发布公司是甲骨文。这是标准Java的最新升级&#xff0c;提供了一系列的新特性和改进&#xff0c;以帮助开发者更高效地编写和维护代码。 版本特性 以下是一些Java 20的新特性&#xff1a; 局部变量类型推断 &#xff1a…