浅谈STL

浅谈STL之Vector STL是Standard Template Library(标准模版库)的缩写,在该库中,包含着大量的预设容器、算法和迭代器,是一个可以简化编程难度和降低时间的好东西,有以下的优点。1. 高性能:STL容器和算法经过高度优化,提供了出色的性能,适用于各种应用场景。2.可复用性:STL代码具有高度的可复用性,可以在不同项目中重复使用,从而提高开发效率。3. 可移植性:STL是C++的标准组成部分,因此在不同的C++编译器和平台上都可以使用。 阅读详情

由于我刚开始学习系统的写博客,个人方面不管是能力还是经验都会有所欠缺,所以肯定会有很多不完善的地方,包括结构安排、要点遗漏、知识错误等等,还请各位批判着看,如有问题,恳请斧正,我将十分感激!

STL是一个标准规范,它只是为各种组件定义了一系列统一的访问接口及他们之间搭配使用的一般规则,而没有规定他们的底层实现。因此各开发商都提供自己的STL版本,比较著名的有P.J. Plauger,HP,SGI等。如无明确说明,本文所指的STL均为C++98标准下的SGI版本,下载地址

STL(Stardand Template Library),即标准模板库的简称。于1994年2月年正式成为ANSI/ISO C++的一部分。

C++标准规定,STL的头文件都不用扩展名,所以一般STL的头文件名称是没有.h后缀的。同时,所有的STL组件都被纳入到std命名空间内,所以在include之后要添加下面一行代码:

using namespace std;

STL是一套十分强大的库,基本将我们日常能使用的数据结构和算法封装为模板的形式,这样的好处是该套库有很强的通用性,可以说对任何类型都支持。

而且使用STL的很方便,避免了在编码过程中重复造轮子的工作,使我们将精力集中在业务的实现逻辑上,而不必纠缠一些细枝末节的东西。比如要对一个整形数组iarr进行排序,只需要下面这句代码即可:

#include<algorithm>
using namespace std;
sort(iarr,iarr+sizeof(iarr)/sizeof(iarr[0]));

这样,我们便可以不用自己编写复杂的排序函数,大大地提高了开发效率。sort函数的原型到后面说算法的部分再说。

STL主要由六大组件组成,他们之间的关系如下:
这里写图片描述

可见,迭代器、存储分配器和函数对象都是为容器服务的。迭代器就像一个指针一样指向容器中某个元素,可以很方便地对其进行存取;存储分配器为容器分配内存空间;

容器

容器类定义在下表所示的头文件中:

头文件内容(元素类型均为T)
list双向链表
vector数组
queue队列
deque双向队列
stack栈
set/multiset集合
map/multimap映射
bitset位图
hash_maphash映射
hash_sethash集合

上表中,stack,queue和deque严格来说并不算是容器,而是容器适配器。因为他们是以其他容器来实现的。为了方便,暂且列在这里。

容器按照其存储元素之间的关系又可以分为序列式容器和关联式容器。以上列表中set/multiset,map/multimap属于关联式容器,其他都属于序列式容器。

序列式容器和关联式容器的区别就是,序列式容器里面的元素之间都是有相对的位置关系的,不管是在逻辑上还是在底层实现上他们都有自己的相对位置。因而在序列式容器里面可以使用诸如push_back(),push_front(),pop_back(),pop_front()等函数;而关联式容器里面的元素在逻辑上总是无序的,如集合(集合中元素的性质有:互异性,确定性,无序性)。但为了能在相应的数据结构中存储和附加在容器对象上算法的效率,关联式容器在物理实现上,其元素也是有相对的位置关系的,只不过对STL的使用者而言,这一切都是透明的,不会被其察觉。

list

list的内部被实现为一个双向循环链表,所以在其中进行insert,find等函数的时间复杂度是O(n),但erase函数为O(1)。其节点定义如下:

struct _List_node_base {
  _List_node_base* _M_next;
  _List_node_base* _M_prev;
};

template <class _Tp>
struct _List_node : public _List_node_base {
  _Tp _M_data;
};

不得不说,STL真是博大精深。list将节点的前后指针和其包含的元素分离开来了,这样会使list更具有通用性。以上代码中,_List_node_base中的_M_next和_M_prev分别指向节点的后继和前趋节点,将其作为一个struct封装,而后被_List_node继承。

  • list支持的构造方法为
explicit list (const allocator_type& alloc = allocator_type());// (1)
explicit list (size_type n, const value_type& val = value_type(),const allocator_type& alloc = allocator_type());//(2)
template <class InputIterator>
list (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());//(3)
list (const list& x);//(4)

下面分别介绍:
(1). 即默认的构造函数,使用list<int> mylist;便会调用该构造函数。当然你也可以把int换成其他的类型。该函数构造一个空的list容器,其中没有任何元素。称为default constructor。
(2). 构造一个含有n个元素的list容器,每个元素都是val值的拷贝。称为fill constructor。即构造出来的list是满的。
(3). 用尽可能多的first和last区间之间的元素构造一个list容器,每个元素对应于元区间的一个元素,并且元素的相对顺序和原来相同。也称为range constructor。
(4). 用另一个list构造该容器,这两个容器中的元素的值,数量及相对顺序都完全相同。因此这是拷贝构造函数(copy constructor)。

  • 析构函数很简单,只有一个:
~list();

该函数析构容器中的所有元素,并释放他们的空间。

  • 重载赋值运算符
list& operator= (const list& x);

作用是拷贝x中的所有元素到当前链表中。需要注意的是,operator=函数不是释放掉当前链表的所有节点后再将x中的元素插入其中的,而是保留了当前空间,直接覆盖其元素值以减少分配空间的开销。

以上就是C++类里的四大金刚。list类支持的其他成员函数还有:

  • 返回迭代器:
函数功能
begin返回指向链表头的迭代器(public)
end返回指向链表尾的迭代器(public)
rbegin返回一个反向迭代器,该迭代器指向反向链表的头部(public)
rend返回一个反向迭代器,该迭代器指向反向链表的尾部(public)

* 返回容量:

函数功能
empty测试list是否为空(public)
size测试list的大小(public)
max_size返回list的最大容量(public)

* 存取元素:

函数功能
front获取第一个元素(public)
back获取最后一个元素(public)

* 修改

函数功能
assign修改list容器中的元素(public)
push_front在list首部插入元素(public)
pop_front删除第一个元素(public)
push_back在list尾部插入元素(public)
pop_back删除最后一个元素(public)
insert插入元素(public)
erase删除元素(public)
swap交换两个元素(public)
resize改变list的大小(public)
clear清空该list容器(public)

* 操作方法

函数功能
splice在容器间转移元素(public)
remove移除特定的元素(public)
remove_if移除满足条件的元素(public)
unique移除重复的元素(public)
merge合并两个list容器(public)
sort对元素进行排序(public)
reverse反转list容器中的元素(public)

* 分配空间

函数功能
get_allocator分配空间

list的内存映像如下:

这里写图片描述

由此可以看出,list只支持顺序存取,而不支持随机存取,因为其底层实现上各元素不是连续存放的。

以上只是对list中的成员函数进行了简单的介绍,其中很多函数都是有重载版本的,在此不再一一列举,具有好奇心的读者可移步:www.cplusplus.com ,然后在最上方的搜索栏搜索”list”即可。其实不止是list,C/C++标准库里面的许多内容这里都介绍得非常全面,本文以下即将介绍的各种东东也可以在上面查到。只不过该网站是英文的,英文和我一样挫的读者就多花点时间读一读,还是很值得的!

本文首发于www.sbrave.cn

【完】

浅谈STL之Stack 这一系列文章是给像我一样的小白们使用的,也欢迎各位dalao指正错误。这个系列预计要出五章,这一章是本系列的第三章。第二章:浅谈STL之Queue声明一下,博主拉杆给油不要慌和笔者是同一个人,所以可能在内容上有相似点,敬请包含。Stack和前文介绍的Queue一样,是一个线性数据结构,区别在于Stack只能在一端进行操作而Queue能在两端进行操作。1.只能在一端进行数据操作:即只能在头部进行访问,删除和插入等操作的数据结构。2.遵循先进后出(FILO)的操作顺序:这一点与前文讲的Queue是不同的。先进入 阅读详情

相关推荐

Silvaco 学习笔记——物理模型:载流子产生复合模型

对载流子的复合机制进行总结

reactortiger的博客 1万+

STL中list中push_back(对象)保存对象的内部实现

STL中list中push_back(对象)保存对象的内部实现 1. 在容器中,存放的是对象拷贝    #include<iostream> #include<list> using namespace std; class A{ int i; static int num; public: A():i(0){ cout&...

weixin_30902675的博客 407

Li‘s 核磁共振影像数据处理-4-使用3D Slicer从DTI计算参数图(FA、ADC等)

从DTI计算参数图 通过3D Slicer软件计算 主要步骤 导入DICOM影像 3D Slicer似乎只能支持DICOM格式和NRRD格式的DTI处理,而无法支持NIFTI+磁场梯度信息文件的方式。(这里不确定,如有错误请指正。) 模块选择: 需要选择或设置的内容包括:选择DicomToNrrd,设置Output DWI Volume file,设置Input Dicom Data Directory。设置好后点击“Apply”。 制作mask。 实质就是去脑壳。 模块选择: 需要设置的内

weixin_38594676的博客 3920

STL list push_back崩溃

写代码过程中,遇到崩溃,崩溃地方是queue的front(),检查了所有代码,未找到原因 后来尝试改为list,结果list 的push_back()数据,就会崩溃,后来找到原因,以下为主要代码,备份一下,以防再犯类似错误 不应该对STL的容器执行memset 清零 typedef struct _Source { char name[128]; uint64_t time;...

u011737099的专栏 3785

Cadence元件库介绍

Cadence安装完之后,在安装目录下,会有默认自带的一些常用元件库。例如,我的Candece安装目录为: D:\Cadence\Cadence_SPB_17.2-2016 元件库所在目录为: D:\Cadence\Cadence_SPB_17.2-2016\tools\capture\library 各个元件库对应的内容如下: AMPLIFIER.OLB 共 182 个零件,存放模拟放大器 IC,如 CA3280,TL027C,EL4093 等。 ARITHMETIC.OLB 共 182 个零件,存放

年少时的棉花糖 1万+

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系

生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结

weixin_31100517的博客 150

【STL】list容器的插入与删除

【STL】list容器插入与删除 添加或插入新元素 list成员方法: push_front():向 list 容器首个元素前添加新元素; push_back():向 list 容器最后一个元素后添加新元素; emplace_front():在容器首个元素前直接生成新的元素; emplace_back():在容器最后一个元素后直接生成新的元素; emplace():在容器的指定位置直接生成新的元素; insert():在指定位置插入新元素; splice():将其他 list 容器存储的多个元素添加到当前

学吧 太深了 1596

CKA-CN考试之路----16

所以结合本题,如果有多个文件中都存在同一个值,务必统一,或者修改最后一个次序的文件。中以不同的文件名来区分不同目的的配置会更有利于阅读.就像本题中的。但当有多个文件中存在同一个参数的不同值,最后会生效哪个值?中,但随着配置越来越多不怎么容易阅读.当多个文件同时存在一个参数,但值又不同。有时候我们会将所有内存参数全部写在。确认服务状态(2个红框中的内容)

Q先生 300

c++标准模板(STL)(std::list)(七)

std::list 是支持常数时间从容器任何位置插入和移除元素的容器。不支持快速随机访问。它通常实现为双向链表。与 std::forward_list 相比,此容器提供双向迭代但在空间上效率稍低。 在 list 内或在数个 list 间添加、移除和移动元素不会非法化迭代器或引用。迭代器仅在对应元素被删除时非法化。

qq_40788199的博客 1319

基于YOLOv8的应急通道占用监测系统设计与实现

通过详细的数据集选择、模型训练、代码实现等内容,本博客为您提供完整的系统搭建过程,帮助您构建高效的监测系统。然而,在一些建筑物和公共场所中,应急通道经常被不当占用,导致紧急情况下无法及时使用,严重影响人员的疏散效率。YOLOv8是YOLO系列中的最新版本,它通过引入深度学习的优化和改进,在保证检测速度的同时,显著提升了检测精度。同时,随着深度学习技术的不断发展,检测精度与速度的提升将使得该系统在更广泛的场景中应用。:如果已有监控设备,可以采集应急通道的实时视频,并进行标注,生成占用监测数据集。

YOLO 797

CVPR 2023 中的半监督学习: FixMatch 的升级版 UniMatch

我们首先回顾下发表在 NeurIPS 2020 上的 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence,FixMatch 是一种更轻量的半监督分类方法。如下图所示,FixMatch 首先使用模型(带标签数据训练后的)对弱增强的未标记图像进行预测,生成伪标签。对于给定的图像,只有在模型产生高置信度的预测时,伪标签才会被保留。然后,在输入同一图像的强增强版本时,训练模型预测伪标签。

NJU phd 在读。 2632

stl的vector和list的push_back效率比较

今天遇到一个问题,在与同事讨论问题的时候,提到vector的push_back是否很快的时候。自己不假思索的认为,如果没有随机读的需求的话,换成链表的方式,会有更快的插入效率。但只是根据一些经验性的做出判断。原因如下:list每插入一个节点,是O(1)的时间复杂度,不需要其他什么操作。而vector如果插入的话,则需要重复分配内存,需要更大空间,这必然很耗时的操作,所以认为list的push_ba

werflychen的专栏 5947

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STL浅谈,从vector到map

本文为C++ STL入门指南,详解vector、stack、map等核心容器的用法与底层原理,助你高效掌握标准模板库!

2401_87687617的博客 706

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

浅谈STL之Queue

这一系列文章是给像我一样的小白们使用的,也欢迎各位dalao指正错误。这个系列预计要出三章,这一章是本系列的第一章。浅谈STL之Vector。

weixin_72238593的博客 1038

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

浅谈 STL

简介 STL是Standard Template Library的简称,中文名标准模板库,从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。 ---------来自《百度百科》

Stardust_AK的博客 402

浅谈STL学习

主要用于存储不重复的元素,而用于存储键值对。二者的find和count方法的返回值都是为了检测元素是否存在,find返回迭代器,count返回匹配的数量(在这两者中都是 0 或 1)。

zjx3610022006的博客 759

浅谈STL中的容器

浅谈STL中的容器首先谈谈Vector,我的理解就是动态数组。在存储区域上是连续的。因此可以随机访问,比如说可以直接访问迭代器it+5这样的元素。它在尾位置处插入元素速度很快,但是在任意位置插入元素速度很慢,因为需要把待插入的元素右边的每个元素都拷贝一遍。类似地删除任意一个而不是vector 的最后一个元素效率同样很低。因为待删除元素右边的每个元素都必须被复制一遍这种代价对于大型的复杂的类

scarletty的专栏 713

【C++】浅谈STL

STL简介什么是STLSTL与C++标准库的关系STL的版本原始版本P. J版本RW版本SGI版本STL的六大容器分类STL的重要性如何学习STLSTL的缺陷 什么是STL STL(Standard Template Library)标准模板库的英文缩写,包含有计算机科学领域常用的基本数据结构和基本算法。 STL与C++标准库的关系 STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、

Anton的博客 502

面试浅谈之 C++ STL 篇

C++ STL 篇

优质后端技术知识记录 1172

浅谈C++ 之STL

浅谈C++之STL 一、sort sort使用方便,效率较高,底层实现是用快排的方式进行排序 要使用该算法,需要#include 头文件(算法头文件) sort底层实现用的是快速排序 1. sort 用法一 对基本类型的数组从小到大排序: sort(数组名+n1,数组名+n2); n1和n2都是int类型的表达式,可以包含变量 如果n1=0,则 + n1可以不写 将数组中下标范围为[n1,n2)的元素从小到大排序。下标为n2的元素不在排序 区间内 程序样例:对无序数组

weixin_44722531的博客 576

C++之浅谈STL

标准模板库。

Yyuan12345678的博客 296

STL常用容器浅谈

STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用。下面,我们就浅谈某些常用的容器。这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点。STL中的常用容器包括:顺序性容器(vector、deque、list)、关联容器(map、set)、容器适配器(queue、stac)。 1、顺序性容器 (1)vector   vecto

夜空中最亮的星 352

浅谈C++STL库

熟练使用STL标准库是每个C++程序员的必备技能。 C++ 标准程序库发展至今,几乎所有内容都被设计为了模板的形式,STL 已经成为 C++ 程序库的重要组成部分。可以这么说,如果 C++ 不支持 STL 标准模板库,就无法使用程序库。 在大多数人看来,计算机既神秘有能干,但在程序员的眼中,计算机又蠢又笨,唯一的优点就是运算速度比人快,不给指令什么都干不了,就是给指令,计算机也不能灵活运用。 比如说,在 C++ 中,同样一个加法,不同的数据类型,要给出不同的运行代码: #include<iostrea

技术宅拯救世界 709

STL浅谈 set

set可以理解为数学中的集合,不存在重复值。 set特性 1.set不存在重复值。 2.set会根据元素大小排序 3.无法通过迭代器改变元素值。(为了维护元素排序规则)。 4.底层为RB-tree set定义 // 默认使用递增排序 template <class Key, class Compare = less<Key>, class Alloc = alloc> cl...

q435201823的博客 150
上一篇: 所有HTTP返回码
下一篇: 浅剖智能指针----auto_ptr
SmartBrave
博客等级 码龄12年 25粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值