C++ STL容器部分对比分析

STL容器有如下分类:
1. 序列容器:vector, list, deque, string
2. 关联容器:set, multiset, map, multimap, hash_set, hash_map, hash_multiset, hash_multimap
3. 其它:stack, queue, bitset


序列容器对比

string类
  • 在内存中连续存放,为了提高效率,会有保留空间,如string s = “asdf”,这时s使用的空间可能是255,当string再次往s里面添加内容时不会再次分配内存,知道内容>255才会再次申请内存,因此提高了性能。当内容>255时,string会先分配一个新内存,然后再把内容复制过去,在复制先前的内容。
  • 对string的操作,如果添加到最后时,一般不需要分配内存,所以性能最快,但如果是对中间或是开始部分操作,如往里面添加元素或是删除元素,需要进行内存复制。性能会降低。同时,如果删除元素,string一般不会释放它已经分配的内存,为了是下次使用时搞笑。
  • string内存是在堆中分配的,所以串的长度可以很大,而char[]是在栈上分配的,长度收到可使用的最大栈长度限制。
  • 由于string在删除时不会释放内存,若string经历了很多次添加删除,可以用如下方式节省空间
string s = "asdfasdf";
string y(s);   //因为在此分配内存时,y只会分配与s中内容大一点的内存
s.swap(y);     //将s与y进行交换
vector类
  • vector就是动态数组,也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后内存也不会释放。对最后元素操作最快(添加、删除),对中间和开始处进行添加删除元素操作需要移动内存,如果原始是结构或类,那么移动的同时还会进行构造和析构操作,所以性能不高。
  • 访问方面,对任何元素的访问都是O(1),也就是常数的,所以vector常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作,相比较可以看到vector的属性与string,同样可以使用swap操作来减少它使用的内存。
  • 总结:需要经常随机访问的可以用vector
list链表类
  • list就是链表,元素也是在堆中存放,每个元素都是放在一块内存中,list没有空间预留的习惯(链表存储,每个元素一个结点),没删除一个元素都会释放它占用的内存。
  • list在哪里添加删除元素性能很高,不需要移动内存块(vector与list的区别主要就是顺序存储与链式存储的区别)。当然也不需要对每个元素都进行构造与析构,所以常用来做随机操作容器,但是访问list里面的元素时就开始和最后访问最快。访问其它元素都是O(n),所以,如果需要经常随机访问的话,还是使用vector比较好。
deque双端队列
  • 也是在堆中保存内容的,每个堆保存好几个元素,然后堆和堆之间有指针指向,有点像list与vector的结合。
  • deque在前面快速的添加删除元素,或者在后面快速的添加删除元素,然后还可以有比较高的随机访问速度

set,map关联容器

  • set是一种关联容器,它用于存储数据,并且能从一个数据集合中取出数据。它的每个元素的值必须唯一,而且系统会根据该值来自动将数据排序。每个元素的值不能直接被改变,内部结构采用红黑树的平衡二叉树。multiset跟set类似,唯一的区别是允许键值重复。
  • set作为一个容器用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都是唯一的,而且系统能根据元素的值自动进行排序,
  • map是一种关联容器,存储相结合形成的一个关键之和映射值的元素。

  • STL中容器对比总结

容器vectordequelistsetmultisetmapmultimap
典型数据结构动态数组数组的数组双向链表二叉树二叉树二叉树二叉树
元素键值对键值对
元素可重复关键之不能重复关键字可以重复
可随机存取
迭代器类型随机存取随机存取双向
元素搜寻速度非常慢对关键字而言快对关键字而言快
快速安插移除尾端头尾两端任何位置----
释放被移除元素的内存绝不会(有大量拷贝)有时有总是总是总是总是
允许保留(预留)内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值