C++ STL简介

C++中的STL是什么? STL基本知识 阅读详情

一、STL简介

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。

STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。以下笔者就简单介绍一下STL各个部分的主要特点。

二、算法

大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。

STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。

算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。

三、容器

在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。

经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。

容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。

数据结构描述实现头文件
向量(vector)连续存储的元素<vector>
列表(list)由节点组成的双向链表,每个结点包含着一个元素<list>
双队列(deque)连续存储的指向不同元素的指针所组成的数组<deque>
集合(set)由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序<set>
多重集合(multiset)允许存在两个次序相等的元素的集合<set>
栈(stack)后进先出的值的排列<stack>
队列(queue)先进先出的执的排列<queue>
优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列<queue>
映射(map)由{键,值}对组成的集合,以某种作用于键对上的谓词排列<map>
多重映射(multimap)允许键对有相等的次序的映射<map>

四、迭代器

下面要说的迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一些(至少笔者是这样)。软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。

迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,<iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。

五、对初学者学习STL的一点建议

对于之前不太了解STL的读者来说,上面的文字只是十分概括地描述了一下STL的框架,对您理解STL的机制乃至使用STL所起到的帮助微乎甚微,这不光是因为深入STL需要对C++的高级应用有比较全面的了解,更因为STL的三个部分算法、容器和迭代器三部分是互相牵制或者说是紧密结合的。从概念上讲最基础的部分是迭代器,可是直接学习迭代器会遇到许多抽象枯燥和繁琐的细节,然而不真正理解迭代器又是无法直接进入另两部分的学习的(至少对剖析源码来说是这样)。可以说,适应STL处理问题的方法是需要花费一定的时间的,但是以此为代价,STL取得了一种十分可贵的独立性,它通过迭代器能在尽可能少地知道某种数据结构的情况下完成对这一结构的运算,所以下决心钻研STL的朋友们千万不要被一时的困难击倒。其实STL运用的模式相对统一,只要适应了它,从一个STL工具到另一个工具,都不会有什么大的变化。

对于STL的使用,也普遍存在着两种观点。第一种认为STL的最大作用在于充当经典的数据结构和算法教材,因为它的源代码涉及了许多具体实现方面的问题。第二种则认为STL的初衷乃是为了简化设计,避免重复劳动,提高编程效率,因此应该是“应用至上”的,对于源代码则不必深究。笔者则认为分析源代码和应用并不矛盾,通过分析源代码也能提高我们对其应用的理解,当然根据具体的目的也可以有不同的侧重。

最后要说的是,STL是ANSI/ISO C++标准的一部分,所以对于一个可以有多种C++实现的过程,首先考虑的应该是STL提供的模板(高效且可移植性好),其次才是各个厂商各自相应的库(高效但可移植性不好)以及自己去编写代码(可移植性好但低效)。

C++:什么是STL? 什么是STL?1. STL概论1.1. STL基本概念1.2. STL六大组件简介1.3. STL优点2. STL三大组件2.1. 容器2.2. 算法2.3. 迭代器2.3. 案例 1. STL概论   长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模 阅读详情

相关推荐

【C++】STL简介

STL简介。开始学习STL之前,是不是得先知道STL是个什么东西,以及如何学习STL呢?话不多说,开始我们今天的内容!是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。本篇博客主要介绍了有关STL的历史,主流版本,六大组件,以及其优缺点和学习方法等内容。希望能帮助到大家。♥C++

2303_79329831的博客 5183

15个最流行的STL模型修复工具

如果你进行 3D 打印,可能遇到过可怕的“无法打印 STL”问题:你的 STL 文件看起来很棒,但它会导致切片机出现问题或导致奇怪的打印错误或完全失败。无论确切原因是什么,这些问题的根源通常归结为 STL 用于表示 3D 模型的连接三角形面和顶点的网格。在创建模型的抽象 CAD 环境中,几乎一切皆有可能。然而,在打印模型的现实世界中却不能这么说。例如,厚度为 0 毫米的墙可以存在于软件中,但不存在于你的构建板上。这就是 STL 修复工具的用武之地。它们可以帮助你识别并修复这些问题,从而产生多样化的模型。

新缸中之脑 1万+

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪

TFN_yzgd的博客 926

《C++初阶之STL》【泛型编程 + STL简介】

本文介绍了C++泛型编程的核心概念及其在STL中的应用。通过分析传统重载函数的局限性,引出泛型编程的优势——通过模板实现代码复用,避免冗余。重点讲解了函数模板的原理(编译时自动生成特定类型代码)和两种实例化方式(隐式/显式)。文章采用比喻(如"代码模具")和代码示例,生动阐释了模板如何抽象数据类型,提升开发效率。作为STL学习的基础,本文强调理解泛型思想对后续掌握容器、算法等组件的重要性。

序属秋秋秋的博客 1995

【驭风计划 算法训练营】周测4:习题11-4、8-4、12-4

给出 nn 个非负整数 x1,x2,⋯,xnx1,x2,⋯,xn,有 qq 个询问,第 jj 个询问给出一个非负整数 yjyj,求其中,xor 表示按位异或运算。

Mege1的博客 1042

深入浅出ISP:用RKISP2.x Tuner工具理解AWB、AE、HDR等核心模块的实战调参

本文深入解析RKISP2.x Tuner工具在ISP图像处理中的实战应用,重点探讨AWB、AE、HDR等核心模块的调参技巧。通过环境搭建、调试工具使用和实际案例,帮助开发者掌握如何在不同光照条件下优化图像质量,实现精准的白平衡、曝光控制和动态范围处理。

weixin_26802933的博客 487

C++的STL简介

C++ 的STL简介 在网上看到一个挺好的STL使用简介,本来想看一下SYL的源代码的,但是看到了这个简介也挺好的,记一个链接,下次自己好找:STL

weixin_44624563的博客 91

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

新年第二篇文章,收尾一个去年计划中发表文章和实现功能。

kbq的博客 1万+

【C++初阶】模版初阶和STL的简介

如果一个类中的数据成员的数据类型不能确定,或者是某个成员函数的参数或者返回值的类型不能确定,就必须将此类声明为模板。class 类模版名//类内成员定义public:_size = 0;int main()//实例化生成对应的类,这里是两个不同的类型//int//doublereturn 0;使用类的模版后,我们就可以创建多个存有不同数据类型的栈了。而使用 typedef 或 using 就只能创建存有同一种数据类型的栈。

PursUnre的博客 891

YOLOv5改进策略|实战应用案例|YOLOv5苹果成熟度检测 ,准确率提升4.6%

苹果作为世界四⼤⽔果之⼀,富含多种维⽣素和矿物质,⼀直深受世界各地消费者的喜爱。据联 合国粮⻝及农业组织统计,全球⽔果产量中,苹果位列第⼆位,仅次于葡萄(贾等⼈,2020 )。然⽽,⼤多数苹果果实都是⼿⼯采摘的,这样的⽣产⽅法效率很低。此外,随着⼈⼝⽼龄化 和农村劳动⼒⼤量涌⼊城市,⽔果种植⾏业的劳动⼒成本也相应上升。所有这些因素都显着影响 着⽔果产品的市场竞争⼒。因此,实时⾼效采收苹果等⽔果,降低采收成本势在必⾏。基于机器 视觉的⽔果采摘机器⼈可以利⽤其信息感知来识别和采摘⽔果。

斌擎科技 2209

指纹浏览器降维打击(下):Cloudflare Turnstile 与 hCaptcha 的底层交互逻辑

本文将深度拆解:Turnstile 与 hCaptcha 的 Iframe 沙箱通信机制,动态混淆 JS 与 PoW(工作量证明)的物理破解法则,以及如何通过 C++ 底层事件合成与环境基因强绑定,实现验证码的“无感过验”。

数据知道的博客 421

C++STL简介

本文详细讲解了C++中STL的重要性,以及STL由那几部分组成,通俗易懂,感兴趣的宝子们赶紧过来看看吧!!!

wer24_25的博客 1389

【四足机器人项目实战】MIT无刷电机FOC硬件电路设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、MCU最小系统--STM32F446RE1.usb串口通讯连接口+程序下载连接口2.MCU电源滤波二、磁编码器角度传感器三、三相驱动桥四、CAN通讯收发器电路五、温度ADC检测六、电源滤波及分压电路1、DC电源输入端2、DC电源滤波电路3、DC电源分压电路4、三相绕线接线端总结参考资料 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对

qq_35635374的博客 7061

C++:STL简介

本文将讲解C++STL简介

Jdxxwu的博客 4400

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

Robot_PLC_HMI_Automation 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++:模板初阶和STL简介

本文介绍了C++泛型编程中的模板技术,主要包括函数模板和类模板。函数模板通过typename/class定义通用函数,编译器根据参数类型自动生成具体版本,解决了代码复用问题。类模板同理,使用模板参数创建通用类,实例化时需指定具体类型。文章详细讲解了模板的隐式/显式实例化、匹配原则以及类模板的定义方式,展示了模板在提高代码复用性和可维护性方面的优势。

weixin_73400147的博客 748

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【c++】STL简介

STL(Standard Template Library,标准模板库),是c++标准库的一个重要组成部分,它提供了一系列通用的类模板和函数,是一个包罗数据结构和算法的软件框架。STL的出现弥补了c++开发效率的不足,大大提高了程序的可复用性。

2301_80955819的博客 2442

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++:模版初阶 | STL简介

本篇详细介绍了模版初阶 | STL简介,让使用者了解模版初阶 | STL简介,而不是仅仅停留在表面,更好的模拟,为了更好的使用. 文章可能出现错误,如有请在评论区指正,让我们一起交流,共同进步!class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();

Makise的博客 1142

C++模板初阶,STL简介,string开头

介绍了C++模板初阶,STL简介,一点点string

2301_81154519的博客 1059
上一篇: C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
下一篇: C++学习的50条忠告
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值