1.介绍 顺序存储容器 : string、vector、list、deque 关联存储容器:map底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入值的时候,会从新构成底层的平衡二叉树,效率有必定影响. set 和map都是无序的保存元素,只能经过它提供的接口对里面的元素进行访问 set:集合, 用来判断某一个元素是否是在一个组里面,使用的比较少 map:映射,至关于字典,把一个值映射成另外一个值,若是想建立字典的话使用它好了 2.string string 是basic_string<char> 的实现,在内存中是连续存放的.为了提升效率,都会有保留内存,如string s= "abcd",这时s使用的空间可能就是255, 当string再次往s里面添加内容时不会再次分配内存.直到内容>255时才会再次申请内存,所以提升了它的性能.当内容>255时,string会先分配一个新内存,而后再把内容复制过去,再复制先前的内容.(Copy-On-Write技术) 对string的操做,若是是添加到最后时,通常不须要分配内存,因此性能最快; 若是是对中间或是开始部分操做,如往那里添加元素或是删除元素,或是代替元素,这时须要进行内存复制,性能会下降. 若是删除元素,string通常不会释放它已经分配的内存,为了是下次使用时能够更高效. 因为string会有预保留内存,因此若是大量使用的话,会有内存浪费,这点须要考虑.还有就是删除元素时不释放过多的内存,这也要考虑. string中内存是在堆中分配的,因此串的长度能够很大,而char[]是在栈中分配的,长度受到可以使用的最大栈长度限制. 若是对知道要使用的字符串的最大长度,那么可使用普通的char[],实现而没必要使用string. string用在串长度不可知的状况或是变化很大的状况. 若是string已经经历了屡次添加删除,如今的尺寸比最大的尺寸要小不少,想减小string使用的大小,可使用: string s = "abcdefg"; string y(s); // 由于再次分配内存时,y只会分配与s中内容大一点的内存,因此浪费不会很大 s.swap(y); // 减小s使用的内存 若是内存够多的话就不用考虑这个了 。capacity是查看如今使用内存的函数。你们能够试试看string分配一个一串后的capacity返回值,还有其它操做后的返回值 3.vector vector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,若是减小大小后内存也不会释放.若是新值>当前大小时才会再分配内存. vector在每次扩张容量的时候,将容量扩展2倍,这样对于小对象来讲,效率是很高的。 对最后元素操做最快(在后面添加删除最快 ), 此时通常不须要移动内存,只有保留内存不够时才须要. 对中间和开始处进行添加删除元素操做须要移动内存,若是你的元素是结构或是类,那么移动的同时还会进行构造和析构操做,因此性能不高(最好将结构或类的指针放入vector中,而不是结构或类自己,这样能够避免移动时的构造与析构)。 访问方面,对任何元素的访问都是O(1),也就是是常数的,因此vector经常使用来保存须要常常进行随机访问的内容,而且不须要常常对中间元素进行添加删除操做. 相比较能够看到vector的属性与string差很少,一样可使用capacity看当前保留的内存,使用swap来减小它使用的内存. 4.list list就是链表,元素也是在堆中存放,每一个元素都是放在一块内存中.list没有空间预留习惯,因此每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存,这与上面不一样,可要看好了. list在哪里添加删除元素性能都很高,不须要移动内存,固然也不须要对每一个元素都进行构造与析构了,因此经常使用来作随机操做容器.可是访问list里面的元素时就开始和最后访问最快访问其它元素都是O(n) ,因此若是须要常常随机访问的话,仍是使用其它的好 5.deque 双端队列,也是在堆中保存内容的.它的保存形式以下: [堆1] ... [堆2] ... [堆3] 每一个堆保存好几个元素,而后堆和堆之间有指针指向,看起来像是list和vector的结合品,不过确实也是如此 deque可让你在前面快速地添加删除元素,或是在后面快速地添加删除元素,而后还能够有比较高的随机访问速度 vector是能够快速地在最后添加删除元素,并能够快速地访问任意元素. list是能够快速地在全部地方添加删除元素,可是只能快速地访问最开始与最后的元素. deque在开始和最后添加元素都同样快,并提供了随机访问方法,像vector同样使用[]访问任意元素,可是随机访问速度比不上vector快,由于它要内部处理堆跳转. deque也有保留空间.另外,因为deque不要求连续空间,因此能够保存的元素比vector更大,这点也要注意一下.还有就是在前面和后面添加元素时都不须要移动其它块的元素,因此性能也很高 6.vector Vs list Vs deque vector:对象数量变化小,对象简单,随机访问元素频繁,而不在意插入和删除的效率 list: 对象数量变化大,对象复杂,插入和删除频繁,而不关心随即存取 deque:须要随即存取,并且关心两端数据的插入和删除 list<指针>彻底是性能最低的作法,这种状况下仍是使用vector<指针>好,由于指针没有构造与析构,也不占用很大内存 http://blog.csdn.net/luojinping/article/details/7799395