类型 | vector | list | deque | Map | Hash_map | Set |
简介 | vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。封装了数组。 | 双向链表,每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。封装了链表。 | 双端队列。(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。deque是在功能上合并了vector和list。 | map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。 | 基于hash table(哈希表)。 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;代价是消耗比较多的内存。 | 它用于存储数据,并且能从一个数据集合中取出数据。它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序。每个元素的值不能直接被改变。内部结构采用红黑树的平衡二叉树。multiset 跟set 类似,唯一的区别是允许键值重复! |
分配空间 | 分配一块连续的内存 | 不连续的内存空间 | 小片的连续内存,小片间用链表连接 | 动态分配 | 分配一大片内存,形成许多桶。 | 动态分配 |
优点 | 1. 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现push_back() pop_back() 2. 随机访问方便,即支持[ ]操作符vector.at() 3. 节省空间。 | 1. 不使用连续内存完成动态操作。 2. 在内部方便的进行插入和删除操作 3. 可在两端进行push、pop | 1. 可以使用[],只是速度没有vector快。 2. 快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢。 3.可在两端进行push、pop | 1.自动建立Key - value的对应。 2. 快速的查找。 3. 遍历性能高于hash_map。 | 1. 用时短,查找效率极高。 2. 适用于数据量较大的查询。 | 1. 内部有序,相当于数组。 2. set是一种集合,可以进行集合的各种操作(并、交、补等)。 |
缺点 | 1. 在内部进行插入删除操作效率低。 2. 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。 3. 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放。 | 1. 不能进行内部的随机访问,即不支持[ ]操作符和vector.at() 2. 相对于verctor占用内存多 | 1. 相对于vector占用更多的内存。 | 1. 查找性能比hash_map低。 | 1. 消耗内存较多。 2. 添加和删除较多的时候,性能比map低。 | 1. 只含有一个key值元素。 |
备注 | 选择标准: 1. 如果需要随机访问一个容器则vector要比list好得多;如果已知要存储元素的个数则vector 又是一个比list好的选择。 2. 如果需要的不只是在容器两端插入和删除元素则list显然要比vector好,除非需要在容器首部插入和删除元素否则vector要比deque好。 3. 如果只在容易的首部和尾部插入数据元素,则选择deque。 4. 如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中。 其他: Set和Vector的区别在于Set不包含重复的数据。Set和Map的区别在于Set只含有Key,而Map有一个Key和Key所对应的Value两个元素。Map和Hash_Map的区别是Hash_Map使用了Hash算法来加快查找过程,但是需要更多的内存来存放这些Hash桶元素,属于采用空间来换取时间策略。 |
C++容器对比
最新推荐文章于 2022-11-03 13:18:18 发布