STL概述

C++ STL概述 C++ STL概述,将STL分为几个主要部分,可参照此分块进行系统性学习。 阅读详情

原文链接:http://blog.youkuaiyun.com/lwbeyond/article/details/7301443

本系列是我学习 STL 的一些笔记,都是一些我工作中常用的主题。其中主要参考《C++标准程序库》这本书和一些网络上的博客。

一.STL 组件

1. 容器(Containers):用来管理某类对象的集合。

2. 迭代器(Iterators):用来在一个对象群集的元素上进行遍历动件。迭代器的接口和一般指针差不多,以operator++累加,以operator* 提取所指的值。

3. 算法(Algorithms):用来处理群集内的元素。

STL 的基本观念就是将数据与操作分离。

数据由容器类加以管理,操作由算法定义,迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作,如下图:


二.容器

容器可以分为两类:

1. 序列式容器:vector, deque, list

2. 关联式容器:set, multiset, map, multimap

3. 容器配接器:stacks,queues, priority queues, string

这是一些特别的容器,它们是根据基本容器类别实现来的。

三.迭代器

迭代器是一个“可以遍历 STL 容器内全部或部分元素”的对象。一个迭代器用来指出容器中的一个特定位置。

事实上每一种容器类型都有自己的迭代器,但它们对外的接口是相同的,这就是一种泛型程序设计。

1. 迭代器的基本操作

(1). Operator*

(2). Operator++

(3). Operator== 和 operator!=

(4). Operator=

2. 获取迭代器

所有容器都提供一些成员函数使我们获得迭代器,最重要的是:

(1). begin() 返回一个迭代器,指向容器的起点,也就是第一个元素的位置。

(2). end() 返回一个迭代器,指向容器结束点,也就是最后一个元素之后的位置。

(1). rbegin() 返回一个迭代器,指向容器最后一个元素的位置。

(2). rend() 返回一个迭代器,指向容器第一个元素之前的位置。

注意:begin() 和 end() 形成了一个半开区间,如下图:


3. 迭代器的类型

任何容器都提供两种迭代器类形,读写模式和只读模式

(1). Container::iterator 读/写模式遍历元素。

(2).Container::const_iterator 只读模式遍历元素。

4. 迭代器的分类

(1). 双向迭代器

双向迭代器,可以以递增++运算前进或以递减--运算后退。

list,set,multiset,map,multimap 这些容器所提供的迭代器都属于此类。

(2). 随机存取迭代器

随机存取不但具备双向迭代器的所有属性,还具备随机访问能力。

也就是它提供了“迭代器算法运算”必要的操作符,如:+n,-n,>,< 等。

vector,deque,string 这些容器的迭代器属于此类。

 注意:

[cpp]  view plain copy
  1. list<char>::iterator pos;  
  2. for (pos = coll.begin(); pos != coll.end(); ++pos) {  
  3.        *pos = toupper(*pos);  
  4.    }  
  5.   
  6. for (pos = coll.begin(); pos != coll.end(); pos++) {  
  7.                                                ^^^^^  // OK, but slower  
  8.       ...  
  9.    }  

++pos 要比 pos++ 效率高,因为后者需要一个额外的临时对象来存放迭代器的原来位置并将它返回,所以一般情况下最好用 ++pos。

四.算法

算法并非容器类形的成员函数,而是搭配迭代器使用全局函数。

这里体现的是泛型函数式编程思维模式,而不是OOP 模式,因为在OOP 概念里,数据和操作是一体的。

注意:

1. 所有的算法都用来处理一个或多个区间内的元素,所以我们必须将区间首尾当做两个参数传给算法。调用者必须保证这个区间的有效性。

2. 所有算法处理的都是半开区间 [begin, end )。

3. 在处理多个区间时,要保证第二个区间能够容纳第一个区间的所有元素。

五. 迭代器配接器

迭代器配接器,也就是一类特殊的迭代器。主要有以下三种:

1. 安插型迭代器 (Insert iterators)

2. 流迭代器 (Stream iterators)

3. 逆向迭代器 (Reverse iterators)

六. 容器内的元素

容器元素的条件:

STL 容器内的元素必须满足下面三个基本要求:

1. 必须是可以用拷贝构造函数进行复制的。

2. 必须是可以用 =操作符完成赋值操作的。

3. 必须是可以用析构函数完成销毁操作的。

Value 与 Reference

所有容器都会建立元素副本,并返回该副本。这意味着 STL 只提供 Value 语意。

STL 只支持 Value 语意,不支持 Reference 语意。如果你想要支持 Reference 语意,你可以用指针作为元素来实现,但是要非常谨慎。

七. 错误与异常

1. 错误处理

STL 的设计原则是效率优先,安全次之。而错误检查相当花时间,所以在 STL 里几乎没有错误处理。

所以对操作人员来说,要自己保证使用 STL 的正确性,或者自己增加一层包装来实现STL的安全性。

2. 异常处理

(1). 所有以节点实现的容器,如 list, set, multiset, mpa, multimap,如果节点构造失败,容器保持不变。

(2). 移除(removing)节点的动作保证不会失败。

(3). 对关联式容器插入(insert)多个元素,如果失败,则无法完全恢复原状。

(4). 对关联式容器插入单一个元素,要么成功,要么没有任何影响。

(5). 所有擦除(erase)操作,无论是针对单一元素或针对多重元素,肯定会成功。

(6). vector,deques类型的容器,在安插(insert)元素时如果失败,都不可能做到完全回复。



STL学习总结 主要总结了自己学习STL的心得,适合于有基础者学习 立即下载

相关推荐

详细的STL学习笔记

完整的STL学习笔记,可以作为参考,适合初学者使用

STL技术——STL概述和入门

STL介绍STL( standard template library),译为标准模板库或者泛型库,是 C++ 提供的一个基础模板的集合。STL 已完全被内置到支持 C++ 的编译器中,不用另外安装。STL广义上可以分为:容器container(本质上就是封装有数据结构的模板类)、算法algorithm、迭代器iterator;容器和算法之间通过迭代器无缝连接。

万里顾一程的博客 4960

湿敏电阻HR202的两种驱动方案实测:IO充放电法 vs. 交流方波ADC法,哪个更适合你?

本文深入评测湿敏电阻HR202的两种驱动方案:IO充放电法和交流方波ADC法。通过原理图分析、精度实测和资源占用对比,揭示交流方波ADC法在精度和稳定性上的优势,特别适合长期监测场景。同时提供IO充放电法在资源受限情况下的应用建议,帮助工程师根据项目需求做出最优选择。

weixin_30421809的博客 466

c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

Stack容器、queue容器以及list容器的基本使用规则

qq_26572229的博客 1509

糖尿病预测(深度学习pytorch实现-最新)

本次做的项目是糖尿病的预测,也是来自kaggle上面的一个小项目。根据一个人的怀孕次数、血糖、血压、皮肤厚度、胰岛素指标、身体质量指数、糖尿病谱系指数、年龄等身体参数来预测一个人是否患有糖尿病。

NangoGreen的博客 5359

手把手教你用Verilog实现AT24C64的I2C读写(附完整仿真流程)

本文详细介绍了如何使用Verilog HDL设计AT24C64 EEPROM的I2C控制器,并配合ModelSim完成完整的仿真验证流程。内容涵盖I2C协议解析、Verilog状态机设计、AT24C64读写操作实现,以及仿真波形分析和调试技巧,为FPGA开发者提供了一套完整的EEPROM控制解决方案。

3c4x5z6v7b的博客 846

C++浓缩学习笔记(4)-STL

参考回答​ 容器可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是模板类,分为顺序容器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下:顺序容器​ 容器并非排序的,元素的插入位置同元素的值无关。包含vector、deque、list,具体实现原理如下:(1)vector 头文件​ 动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能。(2)deque 头文件​ 双向队列。元素在内存连续存放。

dahei_zy的博客 528

说说PSTN、ISDN、 ADSL三种互联网接入方式的区别。

互联网的接入方式: 电话拨号接入(PSTN) ISDN接入 ADSL接入 Cable MODEM接入 局域网接入 光纤接入(FDDI) 卫星接入 DDN专线 目前来说,ADSL和Cable MODEM比较常用,今天我们就先来说说PSTN、ISDN和ADSL的区别。 电话拨号接入(PSTN/POTS,Public Switched Telephone Network / Public Oold Telephone Service) 数据终端设备(DTE)通过数据通信设备(DCE)再连

Winyaz的博客 2万+

STL学习笔记

尽管不同容器对应着不同类别的迭代器,但这些迭代器有着较为统一的定义方式,具体分为 4 种,如表 2所示。通过定义以上几种迭代器,就可以读取它指向的元素,

AnChenliang_1002的博客 334

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3372

C2000 CLA协处理器:嵌入式实时控制性能优化与实战指南

在嵌入式实时控制系统中,主CPU常因高频率、低延迟的控制算法而面临性能瓶颈。为解决此问题,协处理器技术应运而生,它通过硬件并行架构分担计算密集型任务,从而提升系统整体性能。其核心原理在于独立的计算单元与总线设计,能够实现近乎零延迟的响应,这对于电机驱动、数字电源等闭环控制场景具有极高的技术价值。本文聚焦于德州仪器C2000系列微控制器中的控制律加速器(CLA),深入解析其作为独立浮点协处理器如何通过任务调度与消息RAM通信机制,有效实现性能倍增,并提供了从内存配置到代码调试的完整工程实践方案。

weixin_29192211的博客 305

STL 库概述

STL将算法和数据结构分离,非面向对象的本质。下面是STL库概述的Xmind方式总计(持续更新)

Dorothy 602

轻量级替代方案:用AIFlowy + Ollama在本地快速搭建一个可用的AI智能体平台

本文介绍了如何使用AIFlowy和Ollama在本地快速搭建轻量级AI智能体平台,涵盖从环境准备到智能体集成的全流程。通过简化部署步骤和优化性能,15分钟内即可完成搭建,适用于原型验证和小团队协作,显著提升开发效率。

weixin_29207533的博客 220

C++STL系列之概述

STL – 标准模板库(standard template library),涵盖了数据结构和算法,充分体现了C++是一门面向对象的语言,以前在C语言需要自己造轮子,现在使用STL可以更加简单,也隐藏了内部的实现。STL的版本较多,当前主流的版本比如libstdc++,MSVC STL等等,目前Linux系统下使用最为广泛的版本是libstdc++,该版本以 SGI STL 为基础发展而来,参考源代码可以参考这个版本。

weixin_62188419的博客 707

YOLOv11改进策略【模型轻量化】| 替换华为的极简主义骨干网络:VanillaNet

本文记录的是基于VanillaNet的YOLOv11轻量化改进方法研究。VanillaNet的极简主义在于无 shortcut 连接,并且在网络的每个阶段仅使用一层卷积,无额外复杂模块,仅通过自身简洁的架构设计和训练策略,实现有效地训练和优化。本文在替换骨干网络中配置了原论文中的、和11种模型,以满足不同的需求。

Limiiiing的博客 1725

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STL概述——郭炜

1.string类 string 类是下面的模板类实例化出来的 typedef basic_string&lt;char&gt; string; 1.1 sting对象的实例化 string s1("Hello"); string month = "March"; string s2(8,’x’); 错误的范例: string error1 = ‘c’; // 错 string erro...

qq_28912319的博客 2491

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STL 概述

三十分钟掌握STL 这是本小人书。原名是《using stl》,不知道是谁写的。不过我倒觉得很有趣,所以化了两个晚上把它翻译出来。我没有对翻译出来的内容校验过。如果你没法在三十分钟内觉得有所收获,那么赶紧扔了它。文中我省略了很多东西。心疼那,浪费我两个晚上。 译者:kary contact:karymay@163.net STL概述 STL的一个重要特点是数据结构和算法的分离。尽

wuce_bai的博客 390

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STL算法概述

STL算法概述 简介: STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含,中则定义了一些模板类,用来声明函数对象 注意: 编译器无法检测出所传递的迭代器是一个无效形式的迭代器,当然也无法给出算法函数错误的提示,因为迭代器并不是真实的类别,它只是传递给函数模板的一种参数格式而已 STL中算法分类: 操作对象 直

hishyboy的专栏 478

五 STL算法概述

一 概述: (1)算法的一般形式: *所有泛型算法的前两个参数都是一对迭代器,通常称为first和last,用以标示算法的操作区间。 *这个[first,last)区间的必要条件是,first必须能够经由累加(increment)操作符的反复运用,从first到达list。 *任何一个STL算法的声明都,都表现出它所需要的最低程度的迭代器类型。 *许多的STL算法不只支持一个版本,某个版

linux系统、网络编程和分布式计算 918

C++之STL概述

1 什么是STL         STL就是C++ Standard Template Library,也就是标准模版库,是一个高效的C++程序库。STL包含六大组件:容器(container)、算法(algorithm)、迭代器(iterator)、配置器(allocator)、适配器(adapter)和函数对象(function object)。我们在学习这些组件时,应该按其重要程度来区别学

our2848884的专栏 339

C++STL概述

STL概述1 简介2 六大组件3 优点 1 简介 STL(Standard Template Library),标准模板库。是惠普实验室开发的一系列软件的统称,现在主要用在C++中,但引入C++之前在该技术已经存在很长时间。STL从广义上分为容器、算法、迭代器,容器和算法之间通过迭代器进行无缝连接。 STL几乎所有的代码都采用了模板类或者模板函数,这相比传统的函数和类组成的库来说提供了更好的代码重用机会。C++标准程序中隶属于STL的占到了80%以上。 容器(container)、算法(algorit

qq_45311905的博客 629
上一篇: c++ 之typedef
下一篇: 压缩感知(Compressive Sensing)学习之(二)
fly_fish_long
博客等级 码龄11年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值