C++中STL经常使用容器的优势和缺点

咱们经常使用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提升程序性能,在使用以前须要咱们了解清楚。
html

verctor

vector相似于C语言中的数组,它维护一段连续的内存空间,具备固定的起始地址,于是能很是方便地进行随机存取,即 [] 操做符,但由于它的内存区域是连续的,因此在它中间插入或删除某个元素,须要复制并移动现有的元素。此外,当被插入的内存空间不够时,须要从新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来讲执行效率高,但若是遇到大对象,执行效率就低了。数据库

list

list相似于C语言中的双向链表,它经过指针来进行数据的访问,所以维护的内存空间能够不连续,这也很是有利于数据的随机存取,于是它没有提供 [] 操做符重载。数组

deque

deque相似于C语言中的双向队列,即两端均可以插入或者删除的队列。queue支持 [] 操做符,也就是支持随机存取,并且跟vector的效率相差无几。它支持两端的操做:push_back,push_front,pop_back,pop_front等,而且在两端操做上与list的效率
也差很少。或者咱们能够这么认为,deque是vector跟list的折中。数据结构

map

map相似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每一个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,这种特性了使得map相似于数据结构里的红黑二叉树。性能

multimap

multimap相似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。spa

set

set相似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。指针

multiset

multiset相似于数学里面的集合,集合中能够包含重复的元素。htm

 

小结

 

在实际使用过程当中,到底选择这几种容器中的哪个,应该根据遵循如下原则:对象

1、若是须要高效的随机存取,不在意插入和删除的效率,使用vector;队列

二、若是须要大量的插入和删除元素,不关心随机存取的效率,使用list;

三、若是须要随机存取,而且关心两端数据的插入和删除效率,使用deque;

四、若是打算存储数据字典,而且要求方便地根据key找到value,一对一的状况使用map,一对多的状况使用multimap;

五、若是打算查找一个元素是否存在于某集合中,惟一存在的状况使用set,不惟一存在的状况使用multiset。

相关文章
相关标签/搜索