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