C++为我们提供了许多容器可以使用
C++中的容器定义为:

在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。

这些容器大体可以分为顺序容器、关联容器和容器适配器
也就是我们常用的 S T L STL STL
这里只说一下这些容器之间的关系和特点
具体的用法在别的博客中会有详细讲解

关联容器

关联容器特点
set快速查找,元素有序,不允许有重复元素
multiset快速查找,元素有序允许有重复元素
unordered_set快速查找,元素无序,不允许有重复元素
unordered_multiset快速查找,元素无序,允许有重复元素
map映射,key-value型容器,元素有序,不允许有重复元素
multimap映射,key-value型容器,元素有序,允许有重复元素
unordered_map映射,key-value型容器,快速查找,元素无序,不允许有重复元素
unordered_multimap映射,key-value型容器,快速查找,元素无序,允许有重复元素

上面给出的这些关联容器都是非线性的树结构,内部都是用红黑树这种二叉树结构实现的。

set

字面意思集合,其作用也就是一个集合,里面不允许有相同的元素,其内部是通过链表的方式来组织的,每个元素只包含一个关键字。set是保证有序的,每次插入元素之后都会自动按升序排列。

multiset

顾名思义,可重集合,内部实现方式和 s e t set set相同,它允许内部的元素重复,同一个元素可以出现多次

unordered_set

无序集合,是一个存储唯一元素的关联容器,容器中的元素无特别的秩序关系,该容器允许基于值的快速元素检索,同时也支持正向迭代。其内部实现与 s e t set set不同,是用哈希表实现的。

unordered_multiset

和上面一样的,只是元素可以重复

顺序容器

顺序容器特点
deque可以在容器的开头或结尾分别插入或删除元素
vector在容器后方插入或删除元素,可通过下标直接访问
list可以在任何地方插入或删除
deque

双端队列,可以在队列的首尾进行操作,其内部实现更加复杂,支持对所有元素的随机访问,它的随机访问和遍历性能比 v e c t o r vector vector差。它不像 v e c t o r vector vector一样有连续的存储空间,而是多个连续的内存块。应用举例就是 s p f a spfa spfa s l f slf slf优化。

vector

v e c t o r vector vector是一种线性顺序结构,它的大小和所用内存是不定的,会在使用中自动分配。 v e c t o r vector vector是一个类模板,像 v e c t o r &lt; i n t &gt; vector&lt;int&gt; vector<int>才叫一种数据类型。它的存储空间是连续的。

list

这个基本是用的最少的了,它是一个线性双向链表结构。它的随机访问是要按顺序查找,并不像 v e c t o r vector vector一样直接找到地址。内存空间和 d e q u e deque deque一样不是连续的。

容器适配器特点
stack不允许随机访问栈元素,先进后出
queue不允许随机访问队列元素,先进先出
priority_queue不允许随机访问队列元素,优先级高的先出
stack

支持先进后出,是一个线性表,插入和删除只在表的一端进行,它不提供元素的任何迭代器操作。由于它的的内部使用的是其他容器,因此它可看做是一种适配器,作用就是将一种容器转换为另一种容器。它的模版需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为 d e q u e deque deque类型。

queue

queue与上面的stack十分相似,支持先进先出

priority_queue

q u e u e queue queue的头文件中还定义了一个十分有用的模板类,它的特点就是队头的元素一定是优先级最高的元素,和进队顺序无关,这使它的应用范围特别广

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐