stl之顺序容器学习笔记1

C++STL容器内容总结 C++ STL容器使用,原理剖析总结 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ... 阅读详情

初窥容器

容纳特定类型对象的集合,称为容器。

将单一类型的元素聚集起来成为容器,然后根据位置来存储和访问元素,称为顺序容器。顺序容器的排列次序,按照元素添加到容器的次序决定。

stl定义了三种顺序容器:

1、vector

2、list

3、deque

他们的差异在于访问元素的方式,以及做添加、删除元素时的运行代价不同。

1、vector拥有快速的随机访问能力(利用下标);快速的在容器尾部添加和删除元素,但在其他位置插入和删除元素,则会付出较多的代价。

2、list可在容器的任意位置插入或删除元素,且高效。在元素访问方面,只支持顺序访问而不支持随机访问(必须通过自增或自减迭代器)。

3、deque为双端队列,类似于vector,唯一不同的是可以快速在容器头部或尾部插入或删除元素。

与容器相关的:

iterator:迭代器,是一种类型,其作用是遍历容器中的元素。所有的标准库容器都定义了迭代器。

stl的迭代器支持解引用*(取指向的元素的值),自增++(指向下一元素),自减--(指向前一元素),相等==(如两迭代器指向同一元素),不等!=运算符操作符。

举个具体的示例,此示例实现了向容器中添加元素,并顺序输出元素。

 vector<int> ivec;//定义一个vector容器,元素为int型
 vector<int>::iterator iter;//定义一个vector<int>类型的迭代器
 int num;
 while(num!=-1)
 {//向vector中添加元素,-1作为结束标志
  cin >>num;
  ivec.push_back(num);
 }

 iter=ivec.begin();//将iter指向第一个元素
 for(;iter!=ivec.end();++iter)
 {//iter不等于超出容器末端的第一个元素时,即循环输出
  cout <<*iter <<endl;
 }

当然以上程序若要正确编译,还要包含相应的头文件

#include <vector>

#include <list>

#include <deque>

所有的容器都是类模板,在定义时,需提供相应的元素类型,如vector<int>,可以把vector想象成一个罐子,至于罐子中是放糖还是毒药,由我们自己定义。

当然也可以定义。list<string>,deque<double>..所有的容器都带有默认的构造函数,用于创建一个空的容器对象。

容器的构造函数

除了默认构造函数外,stl容器提供了如下几个构造函数,非常符合人们的思维方式:

1、C<T> c;默认构造函数,用于创建一个空的容器。

如:

vector<int> ivec;

2、C<T> c1(c);使用c的副本初始化c1。c和c1必须具有相同的容器类型。适用于所有类型的容器。如:

vector<int> ivec1;

....//向ivec1中加入元素

vector<int> ivec2<ivec1>;

3、C<T> c1(b,e);使用b,e迭代器之间的元素副本初始化c1。b标识了首复制元素,e标识了尾复制元素。适用于所有类型的容器。看以下示例

vector<int> ivec;

vector<int>::iterator iter_mid,iter;

....//向vector中增加元素

iter_mid=ivec.begin()+ivec.size()/2;

iter=ivec.begin();

list<int> ilist(iter,iter_mid);//利用vector的元素初始化list,完全可以,只要元素类型一致即可

4、C<T> c(n,t);使用n个值为t的元素对c进行初始化,t的类型必须为T。只适用于顺序容器。

如:

int a=5;

vector<int> ivec(10,a);

5、C<T> c(n);创建可以容纳n个T类型元素的容器,但不初始化元素。换句话说就是初始化容器的大小,但不初始化元素值。只适用于顺序容器。

vector<int> ivec(100);

容器元素的类型限制

容器元素的类型受以下两个基本条件限制:

1、元素类型必须支持赋值操作。

2、元素类型的对象,必须可以复制。

考虑如下的例子:

如类foo没有默认的构造函数,但有一个需提供int类型形参的构造函数(foo(int a);)那么

vector<foo> fvec;//ok,构造了一个空容器,不牵涉到元素初始化

vector<foo> fvec(10);//error,构造可容纳10个foo对象元素的容器,牵涉到元素构造函数,但未提供构造函数需要的参数

vector<foo> fvec(10,1);//ok,构造一个拥有10个1的容器,牵涉到元素的构造函数,也提供了构造函数需要的参数,可以成功初始化。

当然,我们可以定义容器的容器。

也就是说,可以定义一个vector,其中的元素类型为vector<int>。

vector< vector<int> > ivvect;

注意以上定义,元素类型前后,必须加空格。否则会出现编译错误,因为在std命名空间中有>>操作符,会发生错误的引用。

迭代器详述

前面初步描述了一下iterator迭代器类型,下面详细论述。

迭代器的常用操作:

1、*iter:解引用,返回iter指向的元素的值。

2、iter->mem:先对iter进行解引用,然后获取指定元素的mem成员。相当于(*iter).mem。

3、++iter/iter++:使iter指向下一个元素。

4、--iter/iter--:使iter指向前一个元素。

5、iter1==iter2/iter1!=iter2:两迭代器指向同一元素时,则相等。需注意,两迭代器指向超出末端的下一个元素时,也相等。

vector和deque容器迭代器的额外操作

只有vector和deque提供容器迭代器的算术运算集合和关系运算集合(除==和!=)

1、iter+n/iter-n:将迭代器指向前面或后面的n个元素。新计算出的迭代器必须指向容器中的元素或超出容器末端的下一位置。

2、iter1+=iter2/iter-=iter2:迭代器加减法的符合运算;将iter1加上或减去lter2的运算结果,赋给iter1。

3、iter1-iter2:两个迭代器的减法,其运算结果加上iter2即为iter1。这两个迭代器必须指向同一容器中的元素或超出容器末端的下一位置。

4、>,>=,<,<=:关系操作符,比较的是迭代器在容器中的位置。如iter1指向的元素位于iter2的前面,则iter1<iter2,反之亦然。参与关系运算的两个迭代器必须指向同一容器中的容器或容器超出末端的下一位置。

关系操作符只适用于vector和deque,因为只有这两种容器提供元素快速随即访问(通过元素位置,即下标)。

看一个例子:

//取vector容器的中点

vector<int>::iterator iter=ivec.begin()+ivec.size()/2-1;

list<int> ilist(ivec.begin(),ivec.end());

ilist.begin()+ilist.size()/2;//error,list没有定义+操作

迭代器范围

c++语言使用一对迭代器来标记迭代器范围,这两个迭代器指向了容器的元素或超出容器末端的第一个元素(即最后一个元素的下一个位置),常用begin和end表示。

这种元素范围(首元素/末端的下一位置)称为左闭合区间,其形式为:

[begin,end)

标示从begin开始,end结束,但不包括end。

形成此种元素范围的条件是:

1、两个迭代器均指向容器中的元素或超出末端的下一位置。

2、如果这两个迭代器不相等,则begin不断自增的情况下,必定能begin=end。也就是说,end不可能出现在begin之前。

使用左闭合区间的意义:
1、当begin和end相等时,迭代器范围为空。

2、当begin和end不相等时,范围内至少有一个元素,且begin指向该区间的第一个元素。根据上面第二条,begin不断自增,可以达到begin=end。

考虑以下的例子:
while(begin!=end)

{

  //如果begin==end,(根据意义1)则说明迭代器范围内没有元素,则进入不了循环。(根据意义2)如begin!=end,则范围内肯定有元素,可以安全的解引用。

  ++begin;

}

C++STL详解四:顺序容器 分析顺序容器array、vector、deque、list和heap的底层行为,简单实现vector 和 deque::iterator 阅读详情

相关推荐

STL—— 3种顺序容器的基本功能和特性

1.顺序容器的基本功能          STL中的顺序容器包括向量(vector)、双端队列(deque)和列表(list) (1)构造函数 S s(n,t); //构造一个由n个t元素构成的容器实例s。 S s(n); //构造一个有n个元素的容器实例s,每个元素都是T()。 S s(q1,q2);//使用将[q1,q2)区间内的数据作为s的元素构造s。 (2)赋值函数 s.

味精加盐不加糖 3354

C++STL容器总结

持续更新中!!! 各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map; 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的...

-_- 8万+

C++ | STL之顺序容器、关联容器、容器适配器

文章目录STL简述STL六大组件顺序容器(序列式容器)vectordequelist关联容器容器适配器 STL简述 STL是Standard Template Library的简称,中文名标准模板库,从根本上说,STL是一些“容器”的集合,这些“容器”有list、vector、set、map等,STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。...

ZY-JIMMY 2377

001_顺序性容器

Vector 特点: 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 。 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at() 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector 大多情况下并...

253

语义通信高斯信道仿真代码

【代码】语义通信高斯信道仿真代码。

一去不复返的通信er 427

植物叶绿体基因组分析全攻略:从共线性到密码子偏好性

本文全面解析植物叶绿体基因组分析流程,从共线性分析到密码子偏好性研究。详细介绍了叶绿体基因组结构特征、测序数据获取与质量控制、基因组组装与注释方法,以及比较基因组学和进化分析技术。特别关注IR区边界变异分析和选择压力评估,为植物系统发育研究和物种鉴定提供实用指南。

weixin_28475533的博客 222

c++ list, vector, map, set 区别与用法比较

http://blog.youkuaiyun.com/alex_xhl/article/details/37692297 List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。 Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。L...

weixin_30559481的博客 1285

芯片测试:WAT、CP、FT

最近部门来了一个日本回来的同事,虽然他尽量用非常Poor的中文给我解释一些东西,其中还夹杂着一些英文让我很受挫,于是最近来学一下WAT中的常用的单词含义。直接去查缩写、查单词很难去记住,要把具体的东西放在具体的场景,引发知识的连接才会在脑子里留下一定的映像。感兴趣的一起来学习一下这篇不错的文章吧。注释是我查询记录,如有不妥,欢迎指出修正。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5089

stack,queue,list容器和随机访问

1.stack容器 2.queue容器 3.list容器:插入和删除操作都不会造成原有迭代器的失效,这在vector中是不成立的 vector和list容器是stl中最常用的两个容器 sort函数是标准算法,在使用的时候需要加上#include <algorithm>头文件,但是list容器不支持随机访问迭代 器,不可以使用标准算法,只能使用内部的成员函数,因此需要以L.sort()和L.reverse()的形式来使用,而不能 直接使用sort(); 只有vector和deque容

qq_44194231的博客 2170

【路径规划】Theta_star算法机器人栅格地图最短路径规划【含Matlab源码 2618期】

Theta_star算法机器人栅格地图最短路径规划 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 365

电压跟随器在ADC采样电路中的作用分析

电压跟随器在ADC采集系统中扮演关键角色,它能解决分压电路因ADC输入阻抗导致的电压误差问题。通过运放构成的电压跟随器可隔离信号源与负载,保证采样精度,尤其适用于高阻抗传感器或高速采样场景。工程应用中需注意运放带宽、轨对轨输出能力及抗干扰设计。合理使用电压跟随器能显著提升信号完整性,在复杂电子系统中成为不可或缺的"信号桥梁。

硬核科技 659

STL入门学习笔记----1 STL简介 顺序容器

1.泛型程序设计基本概念 1)概念:用来描述泛型程序设计中作为参数的数据类型所需具备的功能 概念的内涵: 这些功能 概念的外延: 具备这些功能的所有数据类型 模型: 具备一个概念所需要功能的数据类型称为这一概念的一个模型 2. STL简介 一)STL组成包括 容器 迭代器 函数对象 算法 1) 容器 容器是容纳包含一组元素的对象分为顺序容器,关联容器 顺序容器: 将一组具有相同类型的元素...

小小程序员 430

【数据湖仓】:Iceberg、Hudi 和 Paimon 对比

适用于需要多计算引擎支持和复杂查询的离线批处理场景。其中立性和灵活性使其成为构建新型数据平台的理想选择。:在需要高频数据更新和高效小文件管理的场景中表现出色,适合实时数据处理和增量数据更新的业务需求。:专为实时流式数据处理设计,适用于对数据实时性要求高的业务场景,如实时数据分析和实时指标监控。通过以上分析,可以看出 Apache Iceberg、Apache Hudi 和 Apache Paimon 各有其独特的优势和适用场景。企业应根据自身业务需求和技术栈选择合适的数据湖仓方案,以充分发挥其价值。

欢迎来到我的博客,一起探索代码里的世界! 1610

C++ Primer 学习笔记_27_STL实践与分析(1) --顺序容器的定义、迭代器

STL实践与分析 --顺序容器的定义、迭代器 一、顺序容器的定义 顺序容器 容器适配器 vector 支持快速随机访问 stack 后进先出(LIFO) list 支持快速插入/删除

u014094377的专栏 459

NVIDIA AI 学习与认证指南:从入门到精通

NVIDIA的AI学习与认证体系,凭借其先进的技术背景、丰富的课程资源以及强大的行业认可度,已成为AI学习者和从业者的宝贵资源。通过深入学习NVIDIA的课程和获得认证,学习者可以快速掌握最前沿的AI技术,提升自己的职业竞争力。从基础课程到专业认证,NVIDIA为不同层次的学习者提供了量身定制的学习资源,帮助他们掌握AI的核心技能,提升职业竞争力。是其中的一个亮点,它结合了信息检索与生成式AI的能力,使AI可以从外部知识库中实时提取信息,生成更具深度和准确性的内容。,帮助学习者快速掌握该领域的核心技术。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1881

RK3568平台开发系列:Android环境下CAN的使用

在RK3568平台上,我们可以利用Android环境中的API来实现CAN的使用。通过以上步骤,我们可以在Android应用中发送和接收CAN数据,并进行相应的处理。当接收到CAN数据时,将触发onMessageReceived回调方法,我们可以在这个方法中对接收到的数据进行处理。在上述代码中,我们指定了CAN的ID为0x123,数据为{0x01, 0x02, 0x03},并设置了标志位和周期。接收CAN数据需要注册一个监听器,并在监听器中处理接收到的数据。发送CAN数据需要指定CAN的ID和数据。

2301_79330513的博客 1912

C++ STL中容器的使用全面总结

一、容器的定义        在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法。 二、容器的种类   1、顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操

算法改变人生 6万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++之STL顺序容器

STL容器是一个通用的数据结构,可以处理不同数据类型,包含基本的数据结构如链表、堆栈、队列等。可以分为顺序容器、关联容器、 容器适配器、特殊容器。本篇博客将简要介绍一下STL容器中的顺序容器。

m0_74265792的博客 1284

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++STL——顺序容器

参考《C++ prime》第五版

m0_63997099的博客 2354

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++中STL容器总结

STL容器1、容器分类 1、容器分类 STL中通常将容器分为三类:顺序容器、关联容器和容器适配器。 1、顺序容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。 顺序容器包括: vector(向量)、list(列表)、deque(队列)...

EricLee23 2363

C++ STL顺序容器 保姆级详解

在C++的STL中,顺序容器是按顺序存储数据的容器类,用于存储和操作数据集合。顺序容器主要包括 vector、deque、list 和 forward_list,它们各自有不同的实现方式和应用场景。下面详细介绍每种顺序容器的特点、常用操作及其应用场景。

weixin_69480212的博客 1949

c++:STL之顺序容器,关联容器,顺序容器适配器

1.什么是STL STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件...

Kobe51920的博客 2243

STL之顺序容器

容器(container)是容纳、包含一组元素的对象。容器类库中包括7种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。这7种容器可以划分为两种基本类型:顺序容器(sequence container)和关联容器(associative container)。顺序容...

jiaomubai的博客 1144

C++ STL -1 | STL 容器

C++ STL标准模板库提供了多种容器,可分为顺序容器(vector、deque、list)、关联容器(set、map)和无序容器(unordered_set、unordered_map)。vector适合随机访问和尾部操作,deque支持高效头尾操作,list适合任意位置插入删除。关联容器基于红黑树实现有序存储,无序容器基于哈希表提供高效查找。选择容器时需考虑操作效率、内存布局和具体应用场景。STL容器能显著提升开发效率和代码性能,根据需求合理选择容器是关键。

电子异术博物馆 1291

C++ (STL,顺序容器,关联容器,容器适配器)

set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个 集合一样。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能 , 所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。set是一种关联性容器,底层使用红黑树实现,插入删除操作时仅仅移动指针即可,不涉及内存的移动和拷贝, 所以效率比较高。STL 的设计基于泛型编程的思想,通过使用模板,STL 提供了与类型无关的代码,从而实现了代码的高复用性和灵活性。

2402_84770121的博客 871

STL 顺序容器,关联容器

向量 vector :   是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。 在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity ()函数的返回值。当存储的数据超过分配的空间时v

gavin0123的专栏 2948
上一篇: C++容器:顺序容器,关联容器
下一篇: stl之顺序容器学习笔记2
Elecsoft
博客等级 码龄17年 32粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值