C++中STL容器的比较

容器特性:

vector:典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取、修改具有常数时间复杂度,在序列尾部进行插入、删除是常数时间复杂度,但在序列的头部插入、删除的时间复杂度是O(n),可以在任何位置插入新元素,有随机访问功能,插入删除操作需要考虑。

deque(双端队列):序列容器,内存也是连续的,和vector相似,区别在于在序列的头部插入和删除操作也是常数时间复杂度,可以在任何位置插入新元素,有随机访问功能。

list :序列容器,内存是不连续的,任意元素的访问、修改时间复杂度是O(n),插入、删除操作是常数时间复杂度,可以在任何位置插入新元素。

set  :关联容器,元素不允许有重复,数据被组织成一棵红黑树,查找的速度非常快,时间复杂度是O(logN)

multiset:关联容器,和set一样,却别是允许有重复的元素,具备时间复杂度O(logN)查找功能

map :关联容器,按照{键,值}方式组成集合,按照键组织成一棵红黑树,查找的时间复杂度O(logN),其中键不允许重复。

multimap:和map一样,区别是键可以重复

分类:

连续内存容器:vector、deque

所以有数据插入和删除的时候,如果不是在序列的或者两端那么花费的代价是非常大的,因为需要保证连续内存,同时给新元素腾出空间或者填充删除元素的空间,如果存储的是复杂结构的话就要花费大量的时间进行拷贝操作(可以存储复杂结构的指针来弥补这个缺陷,这个讨论在另个总结中进行)

基于节点的容器:list、set、multiset、map、multimap

这样的容器在插入删除元素的时候修改的只是节点的指针,这样的消耗是非常小的。

考虑因素:

(1)需要大量添加元素:vector在大量添加元素的时候问题最大,list对这种情况的适应能力就非常好,deque(由多个内存块组成)前面说过了,他是vector和list的折衷形式,内存不够了就申请一块新的内存,但并不拷贝老的元素。

(2)查找速度:序列容器区分容器是否已排序,排序好的就是logn,没有的是最好是n,关联容器的话,存储的时候存储的是一棵红黑树(一种更为严格的平衡二叉树,文档最后有介绍),总是能达到对数时间复杂度(O(logN))的效率,因为关联容器是按照键值排好序的。

(3)连续内存:如果想任意位置插入元素的话,还是不考虑vector、deque

(4)元素的排序:关联容易会按照某种等价关系排序

(5)内存是否和C兼容:vector兼容

所以优缺点是:

1.      Vector的数据模型就是数组。

优点:内存和C完全兼容、高效随机访问、节省空间

缺点:内部插入删除元素代价巨大、动态大小查过自身容量需要申请大量内存做大量拷贝。

2.      List的数据结构模型是链表

优点:任意位置插入删除元素常量时间复杂度、两个容器融合是常量时间复杂度

缺点:不支持随机访问、比vector占用更多的存储空间

3.      Deque的数据模型是数组和链表的折衷:

优点:高效随机访问、内部插入删除元素效率方便、两端push pop

缺点:内存占用比较高

4.      Map、set、multimap、multiset的数据结构模型是二叉树(红黑树)

优点:元素会按照键值排序、查找是对数时间复杂度、通过键值查元素、map提供了下标访问

看我主页简介免费C++学习资源,视频教程、职业规划、面试详解、学习路线、开发工具

每晚8点直播讲解C++编程技术。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • STL部分 1.STL为什么广泛被使用 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec...
    杰伦哎呦哎呦阅读 4,346评论 0 9
  • 容器 在实际的开发过程中, 数据结构本身的重要性不会逊于操作于数据结构的算法的重要性, 当程序中存在着对时间要求很...
    编程小兔崽阅读 1,111评论 0 1
  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 1,506评论 0 10
  • 1. vector的特点 内存特点: 内存空间连续,随机访问效率高。插入删除:插入或者删除某个元素,需要将现有元素...
    郑行_aover阅读 2,007评论 0 2
  • 什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其...
    Jack_Cui阅读 490评论 0 2