C++容器对比

类型vectorlistdequeMapHash_mapSet
简介    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桶元素,属于采用空间来换取时间策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值