C++ STL序列式容器优缺点记录

STL中有三种序列式容器vector,list,deque。对其分别进行性能介绍

vector:

vector内部是通过连续的动态内存空间(dynamic array)去管理的,每push_back一个元素,将安插到array尾部。

这种通过连续的内存空间去管理的方式,可以方便我们去通过下标索引到值,在其尾部的插入和删除效率都非常之高。

当在vector内部去进行插入和删除则会导致vector容器元素去移动位置,因此效能较差

deque:

deque是一个双端队列,可在首尾进行元素的插入和删除。当在首尾删除时效率较高,在中间位置则会导致移动位置,效率较差

list:

双端链表,插入和删除只需移动内部指针位置,因此非常快,查找的话需要依次去遍历前一个元素,效能较差

时间: 2024-09-29 21:33:15

C++ STL序列式容器优缺点记录的相关文章

STL:序列式容器vector总结

说起数组我们都不陌生,但在C++中,除了数组还多了一个"新朋友"那就是vector.其实vector本质上与array的数据安排以及操作方式也其为相似.它俩唯一的差别就是空间灵活性. 无论在C语言还是C++中,array的空间一旦申请完成就不能进行更改,如果需要更大空间来存储数据,便得重新申请一个新的数组并将原来的数值拷贝过去,然后再将原来数组释放,而这一切都需要用户自己完成.而vector不同的是,它的空间分配更加灵活,当他内存不够存放时,它内部机制会自行进行容量扩充,这对于程序员来

stl源码剖析-序列式容器 之 vector

vector的数据安排以及操作方式,与array(c++自身提供的序列式容器)非常相似.两者唯一的差别在于空间的运用的灵活性.array是静态空间,一旦配置了将不能随意更改其大小,若要更改需要重新配置一块新的空间,如何将元素从旧址中一一搬迁,再释放原来的系统.而vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间已容纳新元素.(实际vector每次动态分配的空间大小是有限的,超过了这个临界值同样是要像array一样进行元素搬迁,下面将会进行详细介绍)vector 是最常用的 C++

STL学习笔记(序列式容器)

Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector<Elem> c1(c2) //产生另一个同型vector的副本,(所有元素都被拷贝) vector<Elem> c(n) //利用元素的default构造函数生成一个大小为n的vector vector<Elem> c(n,elem) //产生一个大小为n的vector,每个元素

《STL源码剖析》学习笔记-第4章 序列式容器

1.vector 1.vector特性 (1)vector有自动扩容操作,每次扩容伴随着"配置新空间 / 移动旧数据 / 释放旧空间"的操作,因此有一定时间成本. (2)vector提供了reserve接口,如果能够对元素个数有大概了解,可以一开始就分配合适的空间. (3)vector的内存空间是连续的,对插入元素的操作而言,在vector尾部插入才是合适的选择.维护的是一个连续线性空间,所以vector支持随机存取. (4)vector动态增加大小时,并不是在原空间之后持续新空间(无

《STL源码剖析》读书笔记之序列式容器(3)

1.heap heap不属于STL容器组件,它是priority queue的底层实现机制. (1)push_heap算法 向堆中加入元素,首先将要加入的元素放到堆所在数组的末端,然后再对这个元素进行上溯操作,直到新堆合法为止.如下图所示: (2)pop_heap算法 pop_heap操作取走堆中的最大(小)值.根据堆的特性,堆的最大(小)值必定是堆所存数组的第一个元素.取堆的最大(小)元素时,将堆的最后一个元素和堆的第一个元素互换,然后再对第一个元素进行下溯操作,直到新堆满足堆的定义.下图给出

《STL源码解析》读书笔记之序列式容器(2)

1.deque deque和vector的最大差异在于deque允许在常数时间内对首端进行元素的插入和删除操作.而且deque没有容量的观念,因为它是动态地以分段连续空间组合而成的,随时可以增加一段新的空间并链接起来.像vector那样因旧空间不足而重新配置一块更大空间的情况在deque里是不会发生的.虽然deque也提供Random Access Iterator,但它的迭代器并不是普通指针,这影响了很多操作的效率. (1)deque的map deque在逻辑上是连续空间,但实际上它是由一段一

stl源码剖析-序列式容器 之 list

较久以前学过数据结构,对链表的定义和行为结构有过了解,所以阅读源码学习stl定义的list容器的并不算吃力. list与vector都是两个常用的容器,与vector不同,list不是连续线性空间的,list是一个双向链表.每次插入或者删除一个元素,将配置或者释放一个元素空间,因此,list对于空间的运用有着绝对的精准,不会造成浪费现象.而且对于任何位置的元素插入或者删除,其操作时间永远是常数时间.(缺点是不能进行随机的访问) list节点 list链表本身和list节点是分开设计的,以下是li

STL源码剖析——序列式容器#2 List

list就是链表的实现,链表是什么,我就不再解释了.list的好处就是每次插入或删除一个元素,都是常数的时空复杂度.但遍历或访问就需要O(n)的时间. List本身其实不难理解,难点在于某些功能函数的实现上,例如我们会在最后讨论的迁移函数splice().反转函数reverse().排序函数sort()等等. list的结点 设计过链表的人都知道,链表本身和链表结点是不一样的结构,需要分开设计,这里的list也不例外,以下是STL list的结点结构: 1 template <class T>

STL浅析——序列式容器vector的构造和内存管理: constructor() 和 push_back()

咱们先来做一个测试capacity是容器容量,size是大小: #include <iostream> #include <vector> using namespace std; int main(){ vector<int> result; for (int i = 0; i < 17; i++) { result.push_back(i); printf("element count: %d\t", result.size()); pri