C++参考文献:cplusplus.com - The C++ Resources Network


目录

一、序列式容器和关联式容器

二、set系列

(1)set类的介绍

(2)set的构造和迭代器

(3)set的接口

  1.insert​编辑

2.find和erase

3.lower_bound和upper_bound

(4)set和multiset的差异

三、map系列

(1)map类的介绍

(2)pair类型介绍

(3)map的接口

1.insert

2.erase

3.operator[]

(4)multimap和map的差别


一、序列式容器和关联式容器

前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间一般没有紧密的关联关系,比如交换一下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。
关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是非线性结构,两个位置有紧密的关联关系,交换一下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有map/set系列和unordered map/unordered set系列。本章节讲解的map和set底层是红黑树,红黑树是一颗平衡二叉搜索树。set是key搜索场景的结构,map是key/value搜索场景的结构。

二、set系列

(1)set类的介绍

set的声明如下图,T就是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。
一般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。因为STL库实现的接口相似度高,我们就不一一展示,挑选重要的来理解学习。

(2)set的构造和迭代器

迭代器是一个双向迭代器。

set支持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是二叉搜索树,迭代器遍历走的中序;支持迭代器就意味着支持范围for,set的iterator和const iterator都不支持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。

(3)set的接口

  1.insert

set的insert不支持插入相同的值。当然不管是不是const迭代器都不支持修改。

说明默认的insert作用就是去重和升序。如果我们想要变成降序的话,我们就需要增加仿函数这个参数。

对于列表值的插入,类似下图。

接着我们也观看一下构造中的列表初始化。下图是先构造了个临时对象,然后再拷贝构造出strset。

2.find和erase

find返回值是迭代器,成功返回要找的迭代器,返回失败返回end的迭代器。

而erase删除提供传迭代器,传数据,还可以传迭代器区间。

这时候会有疑问,为什么第二个返回值不是bool而是size_type呢?这是为了兼容multiset,这里是删除成功返回1删除失败返回0,在multiset中,删除几个返回多少。

我们通过一些例子去熟悉掌握这些接口。例如我们想把set中的最小值删除,这里因为默认是升序,我们删除begin迭代器即可。

例如我们如果要实现输入一个值然后删除。例如直接查找在利用迭代器删除x。

这里erase后迭代器肯定失效。第一种是野指针,第二种是在替换法后当前位置的迭代器意义改变,也称为迭代器失效

3.lower_bound和upper_bound

lower_bound返回大于等于val位置的迭代器,upper_bound则是返回大于val位置的迭代器

        

这个有什么作用呢?假如我们需要删除一段区间的值,而删除一段区间需要左闭右开,这个时候我们就可以用上面两个接口来获得区间。

int main()
{set<int> myset;for (int i = 1; i < 10; i++)myset.insert(i * 10); for (auto e : myset){cout << e << " ";}cout << endl;auto itlow = myset.lower_bound(30);auto itup = myset.upper_bound(60);myset.erase(itlow, itup);for (auto e : myset){cout << e << " ";}cout << endl;return 0;
}

这样我们就能够删除30到60之间的值。

(4)set和multiset的差异

multiset和set的使用基本完全类似,:要区别点在于multiset支持值冗余,insert/find/count/erase都围绕着支持值冗余有所差异,具体参看下面的样例代码理解。相比set不同的是,multiset是排序,但是不去重

而find相比set也不同,不同的是,x可能会存在多个,find查找中序的第一个

count则会返回multiset中x的个数。

erase则会删除所有的x。

三、map系列

(1)map类的介绍

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数,map底层存储数据的内存是从空间配置器申请的。一般情况下,我们都不需要传后两个模版参数。map底层是用红黑树实现,增删查改效率是O(logN),迭代器遍历是走的中序,所以是按key有序顺序遍历的 。

(2)pair类型介绍

我们先来了解一下map的插入,在了解插入之前我们需要去了解pair,因为插入的参数涉及到这个类型。

底层大概就是这样,对比我们能够知晓,first就是Key而second就是value。

typedef pair<const Key, T> value_type;
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){}template<class U, class V>pair(const pair<U, V>& pr) : first(pr.first), second(pr.second){}
};

所以我们在map中使用insert需要使用到pair。

(3)map的接口

1.insert

我们先前提到的pair就是我们在insert的时候所要使用到的,对于insert我们有多种形式insert。

第一种就是我们定义一个有名的pair对象,然后插入pair对象。

第二种我们可以插入一个匿名的pair对象。

第三种我们可以借用函数模板make_pair来插入,make_pair它会自己推导出后面的类型,返回一个pair对象。

C++11后提支持多参数隐式类型转换后,我们就有了第四种方法insert。

在遍历map的时候,与其他容器也有所不同,map没有重载流插入和流提取,我们了解了pair的结构后我们需要去解引用后再调用first或者second。

在之前的学习中,我们能够知晓迭代器不止重载了operator*还重载了operator->。刚好我们存储的对象是结构,这样我们就可以采用箭头。

所以在map中我们常用箭头来取对应的数据。我们要注意map中可以修改value,但不可以修改key

2.erase

erase还是只跟key有关,即使你map中没有key也不会报错。

3.operator[]

我们先来实现一个统计水果出现的次数。思路就是利用find和iterator修改功能,统计水果出现的次数。

但是实际上在map中不使用这种方式来实现,直接通过一行代码就可以搞定。

这是怎么做到的呢?那我们需要来学习了解一下operator[]。这个接口提供了插入,查找和修改的功能。我们再回去观看一下insert。

我们能够发现这里其实有两个pair。

我们重点要理解insert的返回值中的迭代器是什么意思呢?

所以返回的迭代器要么是新插入节点的迭代器,要么是插入失败map里面和插入key相等的迭代器。bool则是根据插入成功失败返回的。总结来说,insert如果插入成功返回的是pair<新插入值所在的迭代器,true>,插入失败则是pair<已经存在的跟key相同值的迭代器,false>,所以insert不仅有插入的功能,还有查找的功能。insert插入失败时充当了查找的功能,因为这一点,insert可以用来实现operator[]。

mapped_type& operator[] (const key_type& k)
{pair<iterator, bool> ret = insert({ k, mapped_type() });iterator it = ret.first;return it->second;
}

我们把operator[]内部实现大概的代码拿出来研究一下。能够得出:1、如果k不在map中,insert会插入k和mapped_type默认值,同时[]返回结点中存储mapped_type值的引用,那么我们可以通过引用修改返映射值。所以[]具备了插入+修改功能。2、如果k在map中,insert会插入失败,但是insert返回pair对象的first是指向key结点的迭代器,返回值同时[]返回结点中存储mapped_type值的引用,所以[]具备了查找+修改的功能。

(4)multimap和map的差别

multimap和map的使用基本完全类似,主要区别点在于multimap支持关键值key冗余,那么insert/find/count/erase都围绕着支持关键值key冗余有所差异,这里跟set和multiset完全一样,比如find时,有多个key,返回中序第一个。其次就是multimap不支持[],因为支持key冗余,[]就只能支持插入了,不能支持修改。

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

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

相关文章

头一次见问这么多kafka的问题

分享一篇粉丝朋友整理的面经&#xff0c;第一次遇见问那么多kafka的问题&#xff0c;看看他是怎么回答的。 先来看看 职位描述&#xff1a; 岗位职责&#xff1a; 负责基于 Go 的后端服务的设计、开发和维护&#xff1b;参与系统架构设计&#xff0c;确保系统的高可用性、高性能…

自底向上了解CPU的运算

文章目录 引言 CPU如何实现逻辑运算 NMOS和PMOS 基于MOS管组合下的逻辑门运算 逻辑运算下运算的实现 ALU的诞生 CPU的诞生 关于二进制运算的研究 十进制转二进制基础换算 为什么负数要使用补码进行表示 为什么反码就能解决正负数相加问题,我们还需要用补码来表示负数呢? 小数…

apache poi与Office Open XML关系

以下内容来自AI https://ecma-international.org/publications-and-standards/standards/ecma-376/ 官方规范 https://poi.apache.org/components/oxml4j/index.html java中针对Office Open XML的实现 Apache poi中各个组件 https://poi.apache.org/components/index.html …

S32K328上芯片内部RTC的使用和唤醒配置

1&#xff1a;RTC介绍 1.1 RTC基础功能介绍 参考《S32K3xx Reference Manual》&#xff0c;S32K328芯片内部自带RTC功能&#xff0c;并且支持从低功耗状态下唤醒设备&#xff1b;1.2 RTC电源介绍 由以下三张图可知 1&#xff1a;RTC由V11供电&#xff0c;V11依赖外部V15供电&am…

【Python】数据可视化之分类图

目录 条形图 箱形图 散点图 分簇散点图 小提琴 分簇小提琴 条形图 条形图是一种直观的图表形式&#xff0c;它通过不同长度的矩形条&#xff08;即“条形”&#xff09;来展示数值变量的中心趋势估计值&#xff0c;其中每个矩形的高度直接对应于该组数据的某个中心量度&…

RabbitMQ模型详解与常见问题

项目demo地址&#xff1a;https://github.com/tian-qingzhao/rabbitmq-demo 一、RabbitMQ组件概念 1.1 Server&#xff1a;接收客户端的连接&#xff0c;实现AMQP实体服务。 1.2 Connection&#xff1a;连接 应用程序与Server的网络连接&#xff0c;TCP连接。 1.3 Channel&…

网络:相比于HTTP,HTTPS协议到底安全在哪?

网络&#xff1a;相比于HTTP&#xff0c;HTTPS协议到底安全在哪&#xff1f; 我们知道HTTPS也是一种应用层协议&#xff0c;它在HTTP的基础上有一层加密&#xff0c;因为HTTP的数据传输都是以明文方式传输的&#xff0c;所以加密主要是为了防止数据在传输的时候被篡改 今天我…

AI 基础设施新范式,百度百舸 5.0 技术深度解析

本文整理自 2025 年 8 月 29 日百度云智大会 —— AI 算力平台专题论坛&#xff0c;百度智能云 AI 计算首席科学家王雁鹏的同名主题演讲。大家下午好&#xff01;昨天在主论坛&#xff0c;我们正式发布了百度百舸 AI 计算平台 5.0&#xff0c;并展示了多项亮眼的性能数据。今天…

IO进程线程;多线程;线程互斥同步;互斥锁;无名信号量;条件变量;0905

思维导图多线程打印ABC运用无名面量 实现进程同步#include<myhead.h> //定义 无名信号量 sem_t sem1; sem_t sem2; sem_t sem3; //线程1 void* task1(void *arg) {while(1){sem_wait(&sem1);printf("A");fflush(stdout);sleep(1);sem_post(&sem2);} } …

固高 GTS-800 运动控制卡完全使用指南:从硬件部署到高阶应用

固高 GTS-800 系列运动控制卡作为中端工业控制领域的标杆产品,以其 8-16 轴同步控制能力、丰富的插补功能和稳定的性能,广泛应用于激光加工、PCB 制造、精密装配等自动化设备中。本文将系统讲解 GTS-800 的硬件架构、开发环境搭建、核心功能实现及工程实践技巧,帮助工程师快…

STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践

导言 STM32 - Embedded IDE - GCC - 如何在工程中生成.bin格式固件 STM32 - Embedded IDE - GCC - 使用 GCC 链接脚本限制 Flash 区域 STM32 - Embedded IDE - GCC - 如何在工程中定义一段 NoInit RAM 内存 STM32 - Embedded IDE - GCC - 如何将编译得到的.bin固件添加CRC32校验…

HTTP协议——理解相关概念、模拟实现浏览器访问自定义服务器

文章目录HTTP协议理解相关概念HTTP相关背景知识认识URLHTTP协议在网络通信的宏观认识urlencode & urldecodeHTTP请求和应答的格式模拟实现浏览器访问自定义服务器关于http requesthttp request的请求行——URI使用浏览器完成静态资源的访问常用的报头属性http response状态…

【服务器】英伟达M40显卡风冷方案心得

在之前的博文中&#xff0c;博主说到最近准备自己组装一台服务器&#xff0c;主要用于有限元仿真&#xff0c;其次兼顾一部分AI机器学习的工作&#xff0c;于是博主就入手了一张英伟达Tesla M40的12G显卡GPU。本来博主也纠结过是买M40还是M60&#xff0c;后来在网上看到说M60看…

Java中的锁升级机制

目录 核心思想 Java对象头&#xff08;Object Header&#xff09;与Mark Word 锁升级的详细步骤 1. 无锁&#xff08;No Lock&#xff09; 2. 偏向锁&#xff08;Biased Locking&#xff09; 3. 轻量级锁&#xff08;Lightweight Lock&#xff09; 4. 重量级锁&#xff…

Scikit-learn Python机器学习 - 特征预处理 - 标准化 (Standardization):StandardScaler

锋哥原创的Scikit-learn Python机器学习视频教程&#xff1a; 2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程主要讲解基于Scikit-learn的Python机器学习知识&#xff0c;包括机器学习概述&#xff0c;特征工程(数据…

windows下wsl2 ubuntu开发配置

配置环境变量# 设置方式 命令/文件 生效范围 适用场景 # 临时 export FORCE_UNSAFE_CONFIGURE1 当前终端 临时编译软件 # 用户级永久 ~/.bashrc或~/.profile 当前用户 长期使用&#xff08;单用户&#xff09; # 系统级永久 /etc/environment或/…

网络编程 05:UDP 连接,UDP 与 TCP 的区别,实现 UDP 消息发送和接收,通过 URL 下载资源

一、概述 记录时间 [2025-09-02] 前置文章&#xff1a; 网络编程 01&#xff1a;计算机网络概述&#xff0c;网络的作用&#xff0c;网络通信的要素&#xff0c;以及网络通信协议与分层模型 网络编程 02&#xff1a;IP 地址&#xff0c;IP 地址的作用、分类&#xff0c;通过 …

告别线缆束缚!AirDroid Cast 多端投屏,让分享更自由

AirDroid Cast 是一款功能强大的跨平台投屏应用&#xff0c;能够轻松实现手机、电脑之间以及手机之间的屏幕共享与控制。无论是工作演示、在线教学还是游戏直播&#xff0c;AirDroid Cast 都能提供流畅稳定的投屏体验。 1. 下载与安装 您可以通过以下链接下载 AirDroid Cast&…

从零开始学大模型之大模型训练流程实践

大模型训练流程实践 本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<< >>Gitee<< 6.1 模型预训练 在上一章&#xff0c;我们逐步拆解了 LLM 的模型结构及训练过程&#xff0c;从零手…

一文从零部署vLLM+qwen0.5b(mac本地版,不可以实操GPU单元)

第一步&#xff1a;下载anaconda for mac https://zhuanlan.zhihu.com/p/350828057 知乎保姆级教程 https://www.anaconda.com/docs/getting-started/anaconda/install#macos-linux-installation 下载地址 第二步&#xff1a;部署vllm的虚拟环境 https://www.53ai.com/news/Op…