一、顺序性容器
简述:顺序容器为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖元素的值,而是与元素加入容器时的位置相对应。所有顺序容器都提供了快速顺序访问元素的能力
1.vector(向量)
基本概念和介绍
对于vector容器,它的数据结构与数组非常类似,但是他们之间的不同之处是数组是静态空间,一旦配置了就不能更改,vector却可以进行动态分配,随着元素的插入和删除,内部的空间也会灵活变动,就和C语言中的malloc和C++中的new是一个道理,不用害怕空间不足而一开始就定义一个很大的数组,节省了内存空间
2.deque(双端队列)
基本概念和介绍
deque容器为双端队列,可以对其两端的数据进行操作,因为它没有capacity属性,因此不会像vector那样”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”,因此,deque没有必须要提供所谓的空间保留(reserve)功能。
3.list
1,list是C++STL容器中的顺序容器,这里的顺序容器区别于关联容器,指的是元素在容器中的位置与大小无关。list和vector不同,vector是顺序存储的,内存是连续的;list底层实际上是双向链表,list的内存是分散的,内存可以在各个位置分布。
2,基于双向链表的数据结构,list具有array、vector、deque等不具备的优势:在任意位置插入和删除元素的时间复杂度O(1),移动元素的效率也很高。因为元素之间是通过指针联系的,在某个元素间插入一个元素改变那指针的指向就可以了。
3,但是正因为底层是双向链表,无法像vector那样通过**下标[]**直接访问元素,需要从头(尾)遍历元素找到元素。
4.array(数组)
array是C++11中新增的容器,它与其他容器不同的是,它的大小是固定的,无法动态扩展或收缩,只允许访问或者替换存储的元素。
二、关联式容器
简述:关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。元素是有序的集合,默认在插入的时候按升序排列。
关联容器包括:
- map(集合)
- set(映射)
- multimap(多重集合)
- multiset(多重映射)
set
- set以RBTree作为底层容器
- 所得元素的只有key没有value,value就是key
- 不允许出现键值重复
- 所有的元素都会被自动排序
- 不能通过迭代器来改变set的值,因为set的值就是键
map
- map以RBTree作为底层容器
- 所有元素都是键+值存在
- 不允许键重复
- 所有元素是通过键进行自动排序的
- map的键是不能修改的,但是其键对应的值是可以修改的
三、容器适配器
stack(堆栈)
stack为堆栈,其内部元素都是需要先进后出(FILO)的,也就是说只有栈顶的元素top才可以被访问到
queue(队列)
queue为队列,它和stack堆栈的正好相反,栈是先进后出,而队列则是先进先出(FIFO)。看到这里是不是想起了我们前面学过的一个顺序性容器deque(双端队列),下面来区分一下他们之间的不同之处:
1、queue可以访问两端但是只能修改队头,而deque可以访问两端并且可以在队首和队尾删除和插入元素
2、deque可以从两端入队,但是queue只能从队尾入队,
3、对于弹出队内元素,deque拥有pop_front(删除队头元素)以及pop_back(删除队尾元素)