原文地址:
http://blog.163.com/zsy_19880518/blog/static/18525812720127293359291/
-
vector(连续的空间存储,可以使用[ ]操作符)
快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间随机的插入、删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销. -
deque(小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[ ],只是速度没有vector快)
快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对deque的排序操作,可将deque先复制到vector,排序后在复制回deque。 -
list(每个元素间用链表相连)
访问随机元素不如vector快,随机的插入元素比vector快,对每个元素分配空间,所以不存在空间不够,重新分配的情况 -
set
内部元素唯一,用一棵平衡树结构来存储,因此遍历的时候就排序了,查找也比较快的哦。 -
map
一对一的映射的结合,key不能重复。 -
stack
适配器,必须结合其他的容器使用,stl中默认的内部容器是deque。先进后出,只有一个出口,不允许遍历。 -
queue
是受限制的deque,内部容器一般使用list较简单。先进先出,不允许遍历。
vector、deque和list都是
动态增长
的,选择标准主要是关注插入特性以及对元素的后续访问要求。
-
vector
:连续的内存区域,随机访问效率高,插入删除效率低。Vector并不是随每一个元素的插入而增长自己,而是当vector需要增长自身时,它实际分配的空间比当前所需的空间要多一些,也就是说,它分配了一些额外的内存容量,或者说他预留了这些存储区(分配的额外容量的确切数目由具体实现定义)。实际上,对于小的对象,vector在实践中比list效率更高。
Vector的动态自我增长越频繁,元素插入的开销就越大。两种解决方案:- 当vector开销变大时,把vector转换成list.
-
更常用的方案是,通过指针间接存储复杂的类对象。
- 首先,容量从1增加到256,重新分配的次数大大减少。
- 其次,指向类对象的指针的拷贝和释放不需要调用该类的拷贝构造函数和析构函数。
-
list
:非连续的内存区域,并通过一对指向首尾元素的指针双向联结起来,从而允许向前向后两个方向进行遍历。插入和删除效率高,随机访问支持不好。
链表和C++语言本身没有任何联系。很多语言都可以实现链表数据结构。
我讲一下
数组和链表的区别
有可能帮助你对链表的使用有个感觉。-
数组
是将元素在内存中连续存放,由于每个元素占用内存相同,所以你可以通过下标迅速访问数组中任何元素。但是如果你要在数组中增加一个元素,你需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果你想删除一个元素,你同样需要移动大量元素去填掉被移动的元素。 -
链表
恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果你要访问链表中一个元素,你需要从第一个元素开始,一直找到你需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了, 只要修改元素中的指针就可以了。
从上面的比较你可以看出,如果你的应用需要快速访问数据,很少或不插入和删除元素,你就应该用数组;相反, 如果你的应用需要经常插入和删除元素你就需要用链表数据结构了。然后你自己可以想一想什么样的应用用链表合适。
-
-
deque
也表示一段连续的内存区域,支持高效在首部插入和删除元素,通过两级数据结构来实现,一级表示实际的容器,第二级指向容器的首和尾。如果容器的主要行为是在前段插入元素,则deque比vector效率高。
下面是选择顺序容器类型的一些准则
- 如果我们需要随机访问一个容器则vector要比list好得多 。
- 如果我们已知要存储元素的个数则vector 又是一个比list好的选择。
- 如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好
- 除非我们需要在容器首部插入和删除元素否则vector要比deque好。
- 如果只在容易的首部和尾部插入数据元素,则选择deque.
- 如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新排序,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中
链表和数组一样是一种数据结构,如何使用完全基于你的应用需求。