C++ STL基本容器string,vector,list,deque,map在STL中基本容器有: string、vector,、list,、deque、set,、map
set 和map都是無序的保存元素,只能通過它提供的接口對里面的元素進行訪問 set:集合, 用來判斷某一個元素是不是在一個組里面,使用的比較少 map:映射,相當于字典,把一個值映射成另一個值,如果想創(chuàng)建字典的話使用它好了 string,、vector、list,、deque,、set 是有序容器 1.string string 是basic_string<char> 的實現(xiàn),在內(nèi)存中是連續(xù)存放的.為了提高效率,都會有保留內(nèi)存,如string s= "abcd",這時s使用的空間可能就是255, 當string再次往s里面添加內(nèi)容時不會再次分配內(nèi)存.直到內(nèi)容>255時才會再次申請內(nèi)存,因此提高了它的性能. 當內(nèi)容>255時,string會先分配一個新內(nèi)存,然后再把內(nèi)容復制過去,再復制先前的內(nèi)容. 對string的操作,如果是添加到最后時,一般不需要分配內(nèi)存,所以性能最快; 如果是對中間或是開始部分操作,如往那里添加元素或是刪除元素,或是代替元素,這時需要進行內(nèi)存復制,性能會降低. 如果刪除元素,string一般不會釋放它已經(jīng)分配的內(nèi)存,為了是下次使用時可以更高效. 由于string會有預保留內(nèi)存,所以如果大量使用的話,會有內(nèi)存浪費,這點需要考慮.還有就是刪除元素時不釋放過多的內(nèi)存,這也要考慮. string中內(nèi)存是在堆中分配的,所以串的長度可以很大,而char[]是在棧中分配的,長度受到可使用的最大棧長度限制. 如果對知道要使用的字符串的最大長度,那么可以使用普通的char[],實現(xiàn)而不必使用string. string用在串長度不可知的情況或是變化很大的情況. 如果string已經(jīng)經(jīng)歷了多次添加刪除,現(xiàn)在的尺寸比最大的尺寸要小很多,想減少string使用的大小,可以使用: string s = "abcdefg"; string y(s); // 因為再次分配內(nèi)存時,y只會分配與s中內(nèi)容大一點的內(nèi)存,所以浪費不會很大 s.swap(y); // 減少s使用的內(nèi)存 如果內(nèi)存夠多的話就不用考慮這個了 capacity是查看現(xiàn)在使用內(nèi)存的函數(shù) 大家可以試試看string分配一個一串后的capacity返回值,還有其它操作后的返回值 2.vector vector就是動態(tài)數(shù)組.它也是在堆中分配內(nèi)存,元素連續(xù)存放,有保留內(nèi)存,如果減少大小后內(nèi)存也不會釋放.如果新值>當前大小時才會再分配內(nèi)存 對最后元素操作最快(在后面添加刪除最快 ), 此時一般不需要移動內(nèi)存,只有保留內(nèi)存不夠時才需要 對中間和開始處進行添加刪除元素操作需要移動內(nèi)存,如果你的元素是結構或是類,那么移動的同時還會進行構造和析構操作,所以性能不高(最好將結構或類的指針放入vector中,,而不是結構或類本身,,這樣可以避免移動時的構造與析構)。 訪問方面,對任何元素的訪問都是O(1),也就是是常數(shù)的,所以vector常用來保存需要經(jīng)常進行隨機訪問的內(nèi)容,并且不需要經(jīng)常對中間元素進行添加刪除操作. 相比較可以看到vector的屬性與string差不多,同樣可以使用capacity看當前保留的內(nèi)存,使用swap來減少它使用的內(nèi)存. 總結 需要經(jīng)常隨機訪問請用vector 3.list list就是鏈表,元素也是在堆中存放,每個元素都是放在一塊內(nèi)存中 list沒有空間預留習慣,所以每分配一個元素都會從內(nèi)存中分配,每刪除一個元素都會釋放它占用的內(nèi)存,這與上面不同,可要看好了 list在哪里添加刪除元素性能都很高,不需要移動內(nèi)存,當然也不需要對每個元素都進行構造與析構了,所以常用來做隨機操作容器. 但是訪問list里面的元素時就開始和最后訪問最快 訪問其它元素都是O(n) ,所以如果需要經(jīng)常隨機訪問的話,還是使用其它的好 總結 如果你喜歡經(jīng)常添加刪除大對象的話,那么請使用list 要保存的對象不大,構造與析構操作不復雜,那么可以使用vector代替 list<指針>完全是性能最低的做法,這種情況下還是使用vector<指針>好,因為指針沒有構造與析構,也不占用很大內(nèi)存 4.deque 雙端隊列,也是在堆中保存內(nèi)容的.它的保存形式如下: [堆1] ... [堆2] ... [堆3] 每個堆保存好幾個元素,然后堆和堆之間有指針指向,看起來像是list和vector的結合品,不過確實也是如此 deque可以讓你在前面快速地添加刪除元素,或是在后面快速地添加刪除元素,然后還可以有比較高的隨機訪問速度 vector是可以快速地在最后添加刪除元素,并可以快速地訪問任意元素 list是可以快速地在所有地方添加刪除元素,但是只能快速地訪問最開始與最后的元素 deque在開始和最后添加元素都一樣快,并提供了隨機訪問方法,像vector一樣使用[]訪問任意元素,但是隨機訪問速度比不上vector快,因為它要內(nèi)部處理堆跳轉 deque也有保留空間.另外,由于deque不要求連續(xù)空間,所以可以保存的元素比vector更大,這點也要注意一下.還有就是在前面和后面添加元素時都不需要移動其它塊的元素,所以性能也很高 |
|