C++ 学习 Day.10(标准模板库简介)

news2024/9/20 14:06:24

标准模板库:

简单地说,标准模板库( STL )是一组模板类和函数,向程序员提供了:
用于存储信息的容器;
用于访问容器存储的信息的迭代器;
用于操作容器内容的算法。
关于STL可见:
(4条消息) 【C/C++】STL详解_沉晓的博客-CSDN博客_c++的stl

 

STL 容器

容器是用于存储数据的 STL 类, STL 提供了两种类型的容器类:
顺序容器;
关联容器。
另外, STL 还提供了被称为容器适配器( Container Adapter )的类,它们是顺序容器和关联容器的变种,包含的功能有限,用于满足特殊的需求。

顺序容器

顾名思义,顺序容器按顺序存储数据,如数组和列表。顺序容器具有插入速度快但查找操作相对
较慢的特征。
STL 顺序容器如下所示。
• std::vector :操作与动态数组一样,在最后插入数据;可将 vector 视为书架,您可在一端添加和
拿走图书。
std::deque :与 std::vector 类似,但允许在开头插入或删除元素。
std::list :操作与双向链表一样。可将它视为链条,对象被连接在一起,您可在任何位置添加或
删除对象。
std::forward_list :类似于 std::list ,但是单向链表,只能沿一个方向遍历。

 

容器适配器

容器适配器( Container Adapter )是顺序容器和关联容器的变种,其功能有限,用于满足特定的需
求。主要的适配器类如下所示。
std::stack :以 LIFO (后进先出)的方式存储元素,让您能够在栈顶插入(压入)和删除(弹
出)元素。
std::queue :以 FIFO (先进先出)的方式存储元素,让您能够删除最先插入的元素。
std::priority_queue :以特定顺序存储元素,因为优先级最高的元素总是位于队列开头。

STL 迭代器

最简单的迭代器是指针。给定一个指向数组中的第一个元素的指针,可递增该指针使其指向下一
个元素,还可直接对当前位置的元素进行操作。
STL 中的迭代器是模板类,从某种程度上说,它们是泛型指针。这些模板类让程序员能够对 STL
容器进行操作。注意,操作也可以是以模板函数的方式提供的 STL 算法,迭代器是一座桥梁,让这些模板函数能够以一致而无缝的方式处理容器,而容器是模板类。
STL 提供的迭代器分两大类。
输入迭代器:通过对输入迭代器解除引用,它将引用对象,而对象可能位于集合中。最严格的
输入迭代器确保只能以只读的方式访问对象。
输出迭代器:输出迭代器让程序员对集合执行写入操作。最严格的输出迭代器确保只能执行写
入操作。
上述两种基本迭代器可进一步分为三类。
前向迭代器:这是输入迭代器和输出迭代器的一种细化,它允许输入与输出。前向迭代器可以
const 的,只能读取它指向的对象;也可以改变对象,即可读写对象。前向迭代器通常用于
单向链表。
双向迭代器:这是前向迭代器的一种细化,可对其执行递减操作,从而向后移动。双向迭代器
通常用于双向链表。
随机访问迭代器:这是对双向迭代器的一种细化,可将其加减一个偏移量,还可将两个迭代器
相减以得到集合中两个元素的相对距离。随机访问迭代器通常用于数组。

从实现层面说,可将“细化”视为继承或具体化。

STL 算法

查找、排序和反转等都是标准的编程需求,不应让程序员重复实现这样的功能。因此 STL STL
算法的方式提供这些函数,通过结合使用这些函数和迭代器,程序员可对容器执行一些最常见的操作。
最常用的 STL 算法如下所示。
std::find :在集合中查找值。
std::find_if :根据用户指定的谓词在集合中查找值。
std::reverse :反转集合中元素的排列顺序。
std::remove_if :根据用户定义的谓词将元素从集合中删除。
std::transform :使用用户定义的变换函数对容器中的元素进行变换。
这些算法都是 std 命名空间中的模板函数,要使用它们,必须包含标准头文件 <algorithm>
#include<algorithm>

使用迭代器在容器和算法之间交互

使用关键字 auto 让编译器确定类型

在程序清单 15.1 中,有多个迭代器声明,这些声明类似于下面这样:
 vector <int>::iterator arrIterator = intArray.begin ();
上述迭代器类型定义看起来令人恐怖。如果您使用的是遵循 C++11 的编译器,可将这行代码简化
成下面这样:
 auto arrIterator = intArray.begin (); // compiler detects type
注意到将变量类型声明为 auto 时,必须对其进行初始化,这样编译器才能根据初始值推断变量的
类型。

 

STL 字符串类

STL 提供了一个专门为操纵字符串而设计的模板类: std::basic_string<T> ,该模板类的两个常用具
体化如下所示。
std::string :基于 char std::basic_string 具体化,用于操纵简单字符串。
std::wstring :基于 wchar_t std::basic_string 具体化,用于操纵宽字符串,通常用于存储支持各种语言中符号的 Unicode 字符。

 

问与答

问:我需要一个数组,但不知道它应包含多少个元素。请问我应使用哪种 STL 容器?
答: std::vector std::deque 能够很好地满足这种需求。这两种容器都负责管理内存,并可根据应
用程序需求动态地调整大小。
问:我的应用程序经常需要执行搜索操作,我应选择哪种容器?
答: 诸如 std::map std::set 及其 unordered 变种等关联容器最适合于需要经常进行搜索的应用程序。
问:我要存储键-值对,并希望能够快速完成查找,但键可能不是唯一的。我应选择哪种容器?
答: 关联容器 std::multimap 适合这种需求。 multimap 可存储非唯一的键 - 值对,查找速度也快,这是关联容器的一个特点。
问:我要开发一个能够在不同平台和编译器之间移植的应用程序,该程序还需要使用能够根据键
快速查询的容器。我应使用 std::map 还是 std::hash_map
答: 移植性是一个重要约束条件,必须使用遵循标准的容器。 hash_map 不是 C++ 标准的一部分,
因此并非所有的平台都支持它。如果您使用的是遵循 C++11 的编译器,也可使用 std::unordered_map

 

参考来源:

《21天学通C++》

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

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

相关文章

Git学习和使用

目录&#xff1a;Git概念和知识Git的四个工作区域和工作流程Git 的四个工作区域Git 的工作流程git文件状态常用操作进阶操作单个本地库绑定多远程仓库方案Git概念和知识 Git的四个工作区域和工作流程 Git 的四个工作区域 Remote&#xff1a;远程仓库 位于托管代码的服务器&a…

【语义分割】语义分割综述文章

目录&#xff1a;语义分割一、什么是语义分割二、什么是图像中的语义信息&#xff1f;三、语义分割中的上下文信息四、语义分割方法五、语义分割神经网络六、目前比较经典的网络七、评价指标一、什么是语义分割 语义分割&#xff0c;也称为像素级分类问题&#xff0c;其输出和…

如何远程访问别人的MySQL数据库

1、 如何远程访问别人的MySQL数据库 - curryzwy - 博客园 (cnblogs.com)https://www.cnblogs.com/curryzwy/p/15730485.html 2、 mysql——同一局域网如何共同访问一台电脑的数据库&#xff08;胎教级教学&#xff09;_七月星辰的博客-CSDN博客_两台电脑共用一个mysql数据库…

1803. 统计异或值在范围内的数对有多少

解法一&#xff1a;字典树 前置知识&#xff1a;字典树 字典树是一种实现字符串快速检索的多叉树结构。 例如&#xff1a;给定字符串集合[cab, cos, car, cat], 我们现在需要判断cat是否存在于字符串集合中。 字典树代码&#xff1a; static int[][] trie new int[N][26]; …

AcWing 1221. 四平方和(二分或哈希)

一、题目描述 二、思路分析 先从时间复杂度的角度入手&#xff0c;这道题的数据范围是106&#xff0c;因此我们的时间复杂度要控制在O(n)O(n)O(n)或者O(nlogn)O(nlogn)O(nlogn)。 对于abcd中的任何一个元素&#xff0c;必定是小于n\sqrt nn​的。 我们的一个思路就是去枚举&…

如何选择用 .net Framework 或 .net core

小米问&#xff1a; 给你一个项目&#xff0c;如何选择用 netframework 或 netcore&#xff1f;如何选择服务器&#xff1f; 怎么去考虑&#xff1f; 咋回答呢 答&#xff1a; 不要考虑.net framework 除非极其特殊的情况 比如目标主机系统版本较低 服务器自然是linux好&a…

2023年考证时间一览表

2022年已经成为历史&#xff0c;在疫情背景全面开放下给大家整理了2023年全年的考试时间以及报名时间新鲜出炉&#xff0c;了解清楚&#xff0c;为2023年提前做好规划&#xff01; 1月份 2022年下半年中小学教师资格考试面试 报名时间&#xff1a;2022年12月9日-12日 考试时间…

大数据:Hive视图和索引

一、视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致&#xff0c;都是一组数据的逻辑表示&#xff0c;本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象&#xff0c;没有关联的存储 (Hive 3.0.0 引入的物化视图除外)&#xff0c;当查询引用视图时&#xff0…

【自学C++】Windows安装C++语言开发环境

Windows安装C语言开发环境 Windows安装C语言开发环境教程 C 的开发环境可以直接使用 C 语言 的开发环境&#xff0c; 同时&#xff0c;Windows 本身就自带 C 语言的运行环境&#xff0c;因此&#xff0c;为了开发 C 语言&#xff0c;我们只需要安装一个 C 语言的开发工具即可…

第03讲:HTTP操作之ElasticSearch文档操作

3.1.2、文档操作 实验1&#xff1a;创建文档 索引已经创建好了&#xff0c;接下来我们来创建文档&#xff0c;并添加数据。这里的文档可以类比为关系型数据库中的表数据&#xff0c;添加的数据格式为 JSON 格式 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 :http://1…

【Kafka】Java实现数据的生产和消费

【Kafka】Java实现数据的生产和消费 Kafka介绍 Kafka 是由 Linkedin 公司开发的&#xff0c;它是一个分布式的&#xff0c;支持多分区、多副本&#xff0c;基于 Zookeeper 的分布式消息流平台&#xff0c;它同时也是一款开源的基于发布订阅模式的消息引擎系统。 Kafka 有如下…

【LeetCode】1803. 统计异或值在范围内的数对有多少

1803. 统计异或值在范围内的数对有多少 题目描述 给你一个整数数组 nums &#xff08;下标 从 0 开始 计数&#xff09;以及两个整数&#xff1a;low 和 high &#xff0c;请返回 漂亮数对 的数目。 漂亮数对 是一个形如 (i, j) 的数对&#xff0c;其中 0 < i < j <…

阻塞式队列

文章目录一、阻塞队列阻塞队列的概念阻塞队列相关类和方法生产者消费者模型二、自定义实现阻塞队列自定义实现循环队列自定义实现阻塞队列生产者消费者模型体验一、阻塞队列 阻塞队列的概念 队列我们并不默认&#xff0c;一提起队列&#xff0c;我们立马就能想到 "先进先…

一条 update 语句的执行过程

1.一条 update 语句的执行流程 一条更新语句&#xff0c;其实是增&#xff0c;删&#xff0c;查的综合体&#xff0c;查询语句需要经过的流程&#xff0c;更新语句全部需要执行一次&#xff0c;因为更新之前必须要先拿到&#xff08;查询&#xff09;需要更新的数据。 Buffer…

低代码平台组件间通信方案复盘

背景介绍3年前我开发了一款零代码搭建平台 H5-Dooring, 主要目的是想用更低的成本, 更快的效率, 上线 web 页面(其实是不想写重复的代码了,写麻了). 好在陆陆续续折腾了3年, 目前已经可以满足基本的页面设计和搭建能力, 并能快速上线页面.之前也在社区分享了很多低代码和零代码…

高、低成本MEMS惯导系统姿态、位置、速度更新算法的对比

高、低成本MEMS惯导系统姿态、位置、速度更新算法的对比一、高成本MEMS惯导系统姿态、位置、速度更新算法1、速度更新2、位置更新3、姿态更新4、程序仿真及实验结果4.1 主函数4.2 子函数4.3 实验结果一、低成本MEMS惯导系统姿态、位置、速度更新算法1、速度更新2、位置更新3、姿…

乾元浩在创业板IPO终止:主要生产禽用疫苗产品,中农大是股东

2023年1月4日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;乾元浩生物股份有限公司&#xff08;下称“乾元浩”&#xff09;提交了撤回上市申请文件的申请&#xff0c;保荐人中信证券也撤回对该公司的保荐。因此&#xff0c;深交所终止了乾元浩首次公开发行股票并在创…

程序员述职报告

程序员述职报告笔者能力有限&#xff0c;仅供参考。做研发的小伙伴&#xff0c;不太擅长于写PPT&#xff0c;对于更高一级别的领导&#xff0c;可能只有年终述职的时候才能全面的了解你的工作。所以需要我们在PPT中表达自我价值&#xff0c;突出角色职责。让领导更清楚的认识你…

访问数据库超时问题排障

1 排障过程 系统从圣诞节那天晚上开始&#xff0c;每天晚上固定十点多到十一点多这个时段&#xff0c;大概瘫痪1h左右&#xff0c;过这时段系统自动恢复。系统瘫痪时的现象就是&#xff0c;网页和App都打不开&#xff0c;请求超时。系统架构&#xff1a; 整个系统托管在公有云…

图解数据结构:盘点链表与栈和队列的那些血缘(单双链表模拟实现栈和队列)

写在前面 Hello&#xff0c;各位盆友们&#xff0c;我是黄小黄。关于前一段时间为什么拖更这件事&#xff0c;这里给大家说一句抱歉。笔者前段时间忙于ddl和一些比赛相关的事件&#xff0c;当然还有些隐藏任务&#xff0c;所以博文更新就放缓了。  这里还需要做一下对以后博文…