C++STL容器 ---- 顺序容器之deque、list

C++ STL常用容器之deque&list 对于STL中deque和list序列式容器用法进行了说明和介绍 阅读详情

顺序容器2---deque:双端队列

1、Deque(doubled-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

       底层数据结构:动态开辟的二维数组,和vector的底层数据结构不同,deque的第二维是按固定大小开辟的,内存扩容时,扩容第一维的数组空间,每次按原空间2倍方式进行扩容,然后把第二维的所有数组调整到第一维数组的中间进行排列,上下预留位置空间,因为deque要支持头部和尾部的增加删除,这样的调整比较方便做头尾数据增删。

2、deque内存不连续,所以较vector可以保存的元素更大,在前面和后面添加元素时都不需要移动其它块的元素。对于deque的排序操作,可以先将deque的数据复制到vector,排序好后再复制回deque。

3、deque两端都能快速插入和删除元素

4、存取元素时,deque内部结构会多一个间接过程,所以元素的存取和迭代器的动作会稍微慢一些。

5、迭代器需要在不同的区块间跳转,所以必须是特殊的智能型指针,非一般指针。

6、deque不支持对容量和内存重分配时机的控制。特别注意,除了头尾两端,在任何地方插入或删除元素,都将导致指向deque元素的任何指针,引用,迭代器失效。不过,deque的内存重分配优于vector,因为其内部结构显示,deque不必在内存重分配时复制所有元素。

7、deque的内存区块不再被使用时,会被释放。

8、deque的数据结构及扩容后的数据结构:

Deque扩容先以2倍扩MAP_SIZE,然后将原本的que放在扩容后MAP_SIZE的中间,使数据增长方向可以继续向两端增长。deque底层不连续,段与段之间连续,每小块之间不连续,是一个动态开辟的二维数组。

9、deque常用方法及相应时间复杂度

 push_back/pop_back    O(1)

push_front/pop_front  O(1)

insert/erase          O(n)

 

顺序容器3---list:链表容器

1、带头节点的双向非循环链表,支持快速插入/删除,所以插入删除比vector快,但随即访问不如vector快

2、底层数据结构:底层是一个带头节点的双向链表,节点内存非连续,扩容就是产生新的链表节点。

3、list常用方法及相应时间复杂度

push_back/pop_back    O(1)

push_front/pop_front  O(1)

insert/erase          O(1)

我们可以看出list的常用的增加删除时间复杂度都趋近于O(1),但是如果查找的话,就要从头结点开始查起,其时间复杂度为O(n)

4、splice()函数,从链表里摘除一个或者一堆节点,不涉及任何内存的开辟释放,效率高。

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int main()
{
	// 定义两个list容器
	list<int> l1;
	list<int> l2;

	for (int i = 0; i < 10; ++i)
	{
		l1.push_back(i);
	}
	for (int i = 10; i < 20; ++i)
	{
		l2.push_back(i);
	}

	// 打印两个list容器的元素值
	for_each(l1.begin(), l1.end(), [](int val){cout << val << " "; });
	cout << endl;
	for_each(l2.begin(), l2.end(), [](int val) {cout << val << " "; });
	cout << endl;
	
	// 把list1容器的首元素0移动到末尾,只涉及指针域的改变,没有做任何的内存和数据拷贝操作
	l1.splice(l1.end(), l1, l1.begin());
	for_each(l1.begin(), l1.end(), [](int val) {cout << val << " "; });
	cout << endl;

	// 把l1容器的首元素移动到l2容器的末尾
	l2.splice(l2.end(), l1, l1.begin());
	for_each(l2.begin(), l2.end(), [](int val) {cout << val << " "; });
	cout << endl;

	// 把l1容器的所有元素移动到l2容器的末尾
	l2.splice(l2.end(), l1, l1.begin(), l1.end());
	for_each(l2.begin(), l2.end(), [](int val) {cout << val << " "; });
	cout << endl;

	return 0;
}

C++11提供的其它的顺序容器: 

forward_list:单向链表,单向顺序访问

array:固定大小数组,内存不可扩容,支持随机快速访问,不能删除或添加元素

顺序容器常见问题: 

1、deque底层空间是否连续?

deque容器底层是动态开辟的二维数组,因此底层空间不是完全连续的,每一个小段的第二维数组是连续的。  

2、vector 和 deque的插入删除效率谁高一些?

vector底层是数组,内存连续,尾插和尾删时间复杂度O(1),其它位置插入删除是O(n)。但是vector的随机访问的时间复杂度是O(1),给定一个下标就可以通过这个下标来访问到元素的值。

deque 头部和尾部的插入删除都是O(1),但是其它位置的插入和删除都是O(n),因为deque底层内存空间不完全连续,可能会牵扯到访问另一段内存空间而耗时,所以在中间进行插入删除时效率没有Vector的高,因为vector底层连续,数据移动的效率更高。

3、vector 和 list如何选择?

一个是数组,一个是链表。两个如何选择,就是对于数组和链表的选择。数组随机访问快,插入删除慢;链表插入删除快,但不支持随机访问,查找需要从头结点开始遍历。

4、迭代器失效的问题?

迭代器在遍历容器的过程中,是不允许修改容器的元素的,如果有增加或者删除导致vector的长度改变,就会使已存在的迭代器失效,所以每次操作之后必须对迭代器进行更新,否则可能会导致程序崩溃。另一种理解:容器不允许在一个线程用迭代器遍历,另一个线程对容器元素进行增删操作。

5、两个不同容器的迭代器能否进行比较?

不同容器的迭代器不能比较,源代码认为如果迭代器没有迭代同一个容器,它们之间的比较没有意义。

因此如果比较,那么两个迭代器比较必须作用于同一个容器。因此迭代器在进行比较的时候,需要判断:

①是否是同一个容器的迭代器

②迭代的容器的元素长度是否一样,迭代过程中容器元素经过改动,一定要及时更新迭代器。

浅谈C++容器(一):三种序列容器vector、list、deque的区别 在C++实际开发过程中,经常需要实现数据的添加、修改、插入、读取等功能,若程序员自己编写一个数据结构来实现,不仅会增加代码的工作量,还会出现许多需要解决的问题。而容器是一种封装了数据结构的类,可实现各种功能,帮助程序员更好地开发。 常用的标准容器可分为两大类,序列容器和关联容器。本文先浅谈序列容器的分类、特点及使用情况,希望帮助开发者选择最合适的容器。 一、分类 序列容器可分为三种,vector向量容器、list列表容器、deque双端队列容器,如下: vector向量容器:可看作一个动态数组,连续存储结 阅读详情

相关推荐

C++ STL deque与list容器对比

本文对这,`std::list` 和 `std::deque` 两种容器进行全面分析,探讨它们的内存分布、底层原理、性能特点、适用场景以及常见使用方法,并对比迭代器在不同操作中的失效情况。

weixin_49329296的博客 1368

deque容器和list容器学习

1.deque简介: deque容器同样是一种顺序容器,什么是顺序容器呢?就是你可以了解你的元素的位置,你可以安排你的元素的位置。和vector相比,deque可以实现用常数的时间在容器头部插入元素。同样deque也没有容量的概念,这是因为deque可以动态地增加连续空间,而不需要像vector那样,因为之前的空间不够用,必须重新找一块内存,把数据拷贝过去,然后销毁之前的。 虽然deque也提

Captain_MXD的博客 1163

c++STL之顺序容器(vector、deque、list)分析

c++ vector、deque、list的分析比较

x1074972500的博客 616

deque&list

一.deque 是一个链表数组 二.deque的基本使用 deque<int> de={1,2,3,4,5,6,7,8,9,10}; deque<int> de2(10,2); de.push_back(11); 三.deque新增功能 deque<int> de={1,2,3,4,5,6,7,8,9,10}; de.push_front(0); //从头...

weixin_46027560的博客 893

C++STL容器内容总结

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

大秦坑王的专栏 6163

C++ STL中的顺序容器:vector、deque和list

与vector相比,deque不要求其元素存储在连续的内存空间中,因此可以更快地进行插入和删除操作。vector是一个动态数组,它具有连续的内存空间,可以通过下标随机访问其中的元素。当vector的元素数量超过其容量时,vector会再分配一块更大的内存空间,并将原有的元素拷贝到新的内存空间中。在C++ STL中,顺序容器是一类可以快速随机访问元素的容器。它们各自有着不同的特点和使用场景。总之,C++ STL中的顺序容器vector、deque和list各具特点,开发者可以根据实际需求选择适合自己的容器。

LogicGuruX的博客 155

C++ STL常见容器(vector list deque 顺序容器篇)

c++中有两种类型的容器:顺序容器和关联容器。 顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector十分相似,采用dynamic array来管理元素,提供随机访问,但是deque的dynamic array头尾两端都开放,可以在头尾两端快速安插和删除。 关联容器主要有map和...

小先生 474

无刷直流电机矢量控制(四):基于滑模观测器的无传感器控制

无刷直流电机矢量控制,采用转速、电流双环控制,电流环dq解耦,d轴采用id=0控制,q轴采用转速外环。采用滑模观测器(SMO),根据电压电流信息进行电机位置角度动态估算,模型可直接运行,转速和角度跟踪精度较高。 本文整理了该方法的基本原理,介绍了在MATLAB/Simulink中的建模和仿真过程,最后附上完整的模型文件。 一、基本原理 滑模观测器(下文简称SMO)是基于滑模变结构控制方法的一种状态观测器。其针对无刷直流电机转子位置估算的实现过程如下。 假设采用矢量控...

Forster-C的博客 6858

C++STL:顺序容器vector,deque,list

在内存中存储为一段连续数组,支持O(1)时间的随机访问(通过下标或指针)。会自动申请更大的内存(VS默认按1.5倍扩容,g++可能按2倍)。扩容时需拷贝旧数据到新空间。:容量不足时按比例扩容(VS默认1.5倍,g++可能2倍)。(越界行为未定义,VS断言报错,Linux可能返回随机值)。底层为动态数组,支持O(1)随机访问(通过下标或迭代器)。:提前分配足够内存,避免反复扩容(拷贝旧数据)。:动态扩容、自动管理内存、提供边界检查。:大小固定、手动管理内存、无越界检查。:大小固定、手动管理内存、无越界检查。

weixin_72359141的博客 694

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 78

人大金仓数据库Kingbase FlySync同步程序安装

Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。

weixin_44312518的博客 1170

C++的STL容器之顺序性容器vector、list、deque

STL对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。顺序性容器:vector、list、deque关联性容器:set、multiset、map、multimap容器适配器:stack、queue、priority_queue本篇主要总结顺序性容器:(btw:获取迭代器的方法:建对象方式::iterator iter;  //例:vector&lt;int&gt;::iterator ...

baodream的博客 571

GX WORKS2通过交换机连接PLC的方法

三菱PLC连接方法的分享

weixin_64927621的博客 3608

C++STL顺序容器:vector、deque、list

文章目录一、vector容器1.1使用方式1.2使用实例二、deque容器2.1底层实现2.2使用方式三、list容器四、vector、deque、list对比分析 我们经常提到STL,那么STL究竟是什么呢? STL:其英文全称为standard template libaray,即标准模板库。我们根据需要直接实例化这些模板,提高了我们使用的效率。 一、vector容器 vector:向量容器,...

Rain的博客 945

飞牛fnNAS个人小账本导入微信账单

本文介绍了将微信支付账单导入ezBookkeeping个人记账系统的详细方法。首先通过微信申请导出账单文件,接收后需进行Excel预处理:删除前导行、添加账户和分类列、整理金额格式等。在ezBookkeeping中需预先设置"微信"分类和账户。导入时需注意列映射关系,包括交易时间、账户名称等关键字段的对应设置。文章还提到处理交易标签、格式转换等细节问题,并建议避免使用"修改余额"功能。该方法同样适用于支付宝账单导入,解决了直接导入可能出现的格式不兼容问题。

dgnankai的专栏 468

µC/OS-II---任务就绪表

意思是:将变量OSRdyGrp中最低位为1的位数赋给y,那么,y就是最高优先级任务所在就绪表的行号,那么最高优先级的任务就在OSRdyGrp[y]行中,再根据。

weixin_45880844的博客 1644

C++ STL中vector、list、deque顺序容器使用介绍

容器分为顺序容器和关联容器,顺序容器提供了控制元素存储和访问顺序的能力,这种顺序不依赖于元素的值,而是与元素加入时的位置相对应。

hanxiaoyong_的博客 1370

第 2 章:PassThrough 直通滤波

通过设置某个维度(如 x、y、z 或 rgb)的取值范围,仅保留该范围内的点,从而达到**点云裁剪(裁边)**或过滤异常值的目的。所有在该范围之外的点会被移除(可选是否保留);点云中包含背景、地面或传感器噪声,需要过滤;通过 z 轴过滤,只保留桌面上方的物体;多轴组合过滤(如同时过滤 x、y、z);可用于地面剔除、车载点云预处理等场景。不支持一次过滤多个字段,可多次调用;仅处理某一层或某一区域的点云数据。原始点云中包含地面、墙面、背景等;在区域裁剪、前景提取中广泛使用;设定一个轴(如z轴);

yumeiguo的博客 335

C/C++STL学习[1]---顺序容器阐述、对比、选择vector,deque,list,forward_list,array,string

STL系列博客开篇,记录一下自己学C++STL相关的心得。这篇博客主要是写顺序容器的类型以及各个容器之间的异同还有平时对容器使用的选择。顺序容器表示这个容器提供了快速顺序访问元素的能力。容器名称简述vector可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢deque双端队列。支持快速随机访问。在头尾位置插入/删除速度很快list双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快单向链表。只支持单向顺序访问。

Edwinwzy的博客 434

MathType公式使用技巧汇总——Mathtype怎么在word中编辑公式?论文中公式有哪技巧?有哪些注意事项?论文中的公式怎么写?

如果word中到公式编号(2-1)中间的符号如下图........ .......类似与省略号的,这是手动打的空格,公式和编号的位置都是手动敲空格操作的,这种就只是使用MathType写了公式而已,格式上还是很不方便的。**如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。而第二种,是公式里面带的括号符号,他是可以随着公式结构自适应变化的。这时需要将公式插入到一行文字的某处,

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 5万+

efm32 入门.pdf

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

C++学习笔记----STL顺序容器(vector、deque、list等)

1.顺序容器的类型 顺序容器是C++语言STL中的重点,顺序容器提供了一种处理多个对象的快捷方法。 顺序容器的类型如下: 除了list和forward_list其他的元素都存放在连续的内存空间中。具体改使用哪种容器应该根据使用的方式来判断,如果需要随机访问则使用vector或者deque,如果使用频繁的插入元素则应该使用list,主要根据操作的类型选择容器。一般情况下使用vector,除非有更好的理由选择其他的容器。 每个容器都定义在一个头文件中,一般该头文件的名字就是该容器的名字。 2.迭代器以及容器的

qq_44664843的博客 428

VC中sqlite的使用

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

C++总结(5):STL顺序容器之array、vector、deque、forward_list、list详解

容器是一个持有其他对象元素集合的容器对象,以类模板的形式实现,可以灵活地支持不同类型的元素。容器负责管理其元素的存储空间,并提供成员函数来直接或通过迭代器(类似于指针的引用对象)访问它们。C++中有多种种类的容器,包括:顺序容器()、关联容器()、无序容器()和容器适配器(这篇文章先来详细介绍一下顺序容器的用法。顺序容器实现了可以按顺序访问的数据结构,它包括array(静态连续数组)、vector(动态连续数组)、deque(双端队列)、(单向链表)和list(双向链表)。

主要分享嵌入式软件、人工智能部分知识 2171

廖雪峰Python教程[完整版]

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++STL系列--1.顺序容器vector,list,deque

容器的定义 容器,置物置所也。 容器通俗来讲就是一种数据结构。 STL提供了一组顺序容器:vector,list,deque,stack,queue,priority_queue;其中stack和queue只是deque改头换面而成,内部的数据结构还是deque。 vector容器 vector的数据和array非常相似。但是array是静态空间,一旦配置就不能改变;需要扩容的时候需要手动扩容,非常麻烦;而vector是动态空间,随着元素的加入,内部机制会自动扩容空间容纳新元素。 vector采用的数据结构

ALITAAAA的博客 348

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

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

weixin_69480212的博客 1950

C++ | STL标准库之顺序容器

前言 STL六大组件中的容器按照结构特征可分为顺序容器(链状)、关联式容器(树状)和无序式容器。本文就其中顺序容器进行总结和介绍。 一、顺序容器概述 标准库顺序容器有:vector、deque、list、forward_list、arry、string。六个顺序容器中,只有arry是固定大小。 vector: string和vector将元素保存在连续的内存空间中,因此由下标计算其地址很方便。但因为其连续的特性,在其中间位置添加或删除元素非常耗时,这可能会移动变动位置之后的所有元素。 注: vect

weixin_44742670的博客 1739

C++ STL容器总结(一)——顺序性容器

C++ STL总结(一)顺序性容器概述通用容器操作构造函数赋值与swap大小添加/删除元素(不适用于array)获取迭代器反向容器的额外成员(不支持forward_list)vector特性常用函数dequeliststring 通用容器的分类 STL 对定义的通用容器分三类:顺序性容器,关联式容器和容器适配器。 顺序性容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器...

Leokb24的博客 1236
上一篇: C++STL容器----顺序容器之vector
下一篇: C++ 继承与多态(一)
Disremembrance
博客等级 码龄9年 18粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值