天天看点

c++容器详解

C++为我们提供了许多容器可以使用

C++中的容器定义为:

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

这些容器大体可以分为顺序容器、关联容器和容器适配器

也就是我们常用的

这里只说一下这些容器之间的关系和特点

具体的用法在别的博客中会有详细讲解

关联容器

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

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

set

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

multiset

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

unordered_set

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

unordered_multiset

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

顺序容器

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

deque

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

vector

是一种线性顺序结构,它的大小和所用内存是不定的,会在使用中自动分配。是一个类模板,像才叫一种数据类型。它的存储空间是连续的。

list

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

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

stack

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

queue

priority_queue