C++STL容器

一、顺序性容器

简述:顺序容器为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖元素的值,而是与元素加入容器时的位置相对应。所有顺序容器都提供了快速顺序访问元素的能力

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(删除队尾元素)

你可能感兴趣的:(c++,开发语言)