Set和map是無序的存儲元素,裏面的元素只能通過它們提供的接口訪問。
集合:集合,
用於判斷壹個元素是否在壹個組中,很少使用。
映射:映射相當於字典,將壹個值映射到另壹個值,如果您想創建字典,可以使用它。
底層采用樹形結構,大部分由平衡二叉樹實現。尋找某個值的時間是常數,遍歷效果好。
只有每次插入壹個值時,才會重新構建底部平衡二叉樹,這對效率有壹定的影響。
字符串、向量、列表、隊列和集合是有序容器。
1.string
String是basic _ string
“abcd”,那麽S使用的空間可能是255。
當string再次向S添加內容時,直到content》時才會再次分配內存;內存將在255小時時再次應用,從而提高其性能。
當內容》時;在255,string將首先分配壹個新的內存,然後復制內容,然後復制以前的內容。
對於string的操作,如果加到最後,壹般不需要分配內存,所以性能最快;
如果對中間或開頭部分進行操作,例如在那裏添加或刪除元素,或者替換元素,此時需要復制內存,性能將會降低。
如果妳刪除了壹個元素,string不會釋放它所分配的內存,這樣它在下次使用時會更有效率。
因為string會有預留內存,如果大量使用會有內存浪費,這是需要考慮的。此外,有必要考慮在刪除元素時不要釋放太多內存。
string中的內存是在堆中分配的,因此string的長度可以很大,而char【】是在堆棧中分配的,其長度受到可以使用的最大堆棧長度的限制。
如果知道要使用的字符串的最大長度,可以使用普通的char【】代替string。
字符串長度未知或變化很大時使用字符串。
如果字符串被多次添加和刪除,其大小將遠遠小於最大值。要減小字符串的大小,您可以使用:
字符串s =
“abcdefg”;
字符串y(s);//因為再次分配內存時,Y只會分配比S大的內存,所以浪費不會很大。
標準互換(y);
//減少s使用的內存。
如果有足夠的內存,則不必考慮這壹點。
容量是檢查現在使用的內存的功能。
您可以嘗試逐個字符串分配容量後的返回值,以及其他操作後的返回值。
2 .矢量
向量是壹個動態數組。它還在堆中分配內存。元素是連續存儲的,並且有保留的內存。如果減小大小,將不會釋放內存。如果新值》;直到當前大小才會分配內存。
它有壹個連續的內存空間,並且它的起始地址是相同的,因此它可以支持隨機訪問,即【】運算符。但是,由於其內存空間是連續的,中間插入和刪除會導致內存塊的復制。此外,當陣列後面的內存空間不夠時,需要重新申請足夠大的內存並復制內存。這些都極大地影響了vector的效率。
對最後壹個元素的操作是最快的(後面的添加和刪除是最快的)。
此時,通常不需要移動內存,只有在預留內存不夠時才需要移動。
在中間和開頭添加和刪除元素需要移動內存。如果您的元素是結構或類,它們將同時被構造和析構,因此性能不高。
最好將結構或類的指針放在vector中,而不是結構或類本身,這樣可以避免移動時的構造和破壞。
在訪問方面,對任何元素的訪問都是O(1),這是壹個常數,因此經常使用vector來保存需要頻繁隨機訪問的內容,並且不需要頻繁添加或刪除中間元素。
通過比較,我們可以看到vector的屬性類似於string,我們還可以使用capacity來查看當前保留的內存並交換以減少其使用的內存。
摘要
如果需要頻繁隨機訪問,請使用vector
3 .列表
List是壹個雙向鏈表,元素也存儲在堆中。每個元素都放在壹塊內存中,它的內存空間可以是不連續的。通過指針訪問數據使其隨機訪問效率非常低,因此它不提供【】運算符的重載。但是,由於鏈表的特性,它可以支持在任何地方刪除和插入,並且效率很高。
List沒有空間預留的習慣,因此分配的每個元素都將從內存中分配,刪除的每個元素都將釋放它所占用的內存。
List在任何地方添加和刪除元素時都具有高性能,並且不需要移動內存。當然,它不需要構造和銷毀每個元素,因此經常被用作隨機操作容器。
但是當訪問列表中的元素時,第壹個和最後壹個訪問是最快的。
對其他元素的訪問是O(n)
所以如果妳需要頻繁隨機訪問,妳最好使用另壹個。
摘要
如果妳喜歡頻繁地添加和刪除大型對象,那麽請使用list。
要保存的對象不大,構造和銷毀操作也不復雜,可以用vector代替。
列表& lt指針》;是最低性能,這種情況下還是使用vector很好,因為指針不是構造和析構的,它們不會占用太多內存。
4 .德克
雙端是雙端
隊列),這也將內容保存在堆中。其保存形式如下:
【堆1】
...
【堆2】
...
【堆3】
每個堆保存幾個元素,然後堆和堆之間有壹個指針,看起來像是列表和向量的組合,但這是真的。
Deque允許您在前面快速添加刪除元素,或者在後面快速添加刪除元素,然後您可以擁有相對較高的隨機訪問速度。
它支持【】運算符,即它支持隨機訪問,這使您可以在前面或後面快速添加刪除元素,然後它可以具有相對較高的隨機訪問速度,這幾乎與vector的效率相同。它支持兩端操作:push _ back、push _ front、pop _ back、pop _ front等。,兩端操作的效率和list差不多。
在標準庫中,vector和deque提供了幾乎相同的接口,它們之間的結構差異在於兩個容器在組織內存方面有所不同。deque按頁面或塊分配內存,每個頁面包含固定數量的元素。相反,vector分配連續內存,只有在序列末尾插入元素時才有效。deque的分頁組織甚至可以在容器的前端提供恒定時間的插入和擦除操作,並且在卷增長方面比vector更有效。
總結:
Vector可以在末尾快速添加和刪除元素,並且可以快速訪問任何元素。
List可以在任何地方快速添加和刪除元素,但只能快速訪問第壹個和最後壹個元素。
Deque在開頭和結尾添加元素的速度壹樣快,並提供了壹種隨機訪問方法。與vector壹樣,它使用【】來訪問任何元素,但隨機訪問速度不如vector快,因為它必須在內部處理堆跳轉。
Deque也有預留空間。此外,由於deque不需要連續的空間,因此它可以比vector節省更多的元素,這壹點也應該註意。此外,在前後添加元素時,它不需要移動其他塊的元素,因此性能也很高。
因此,在實際使用中,如何選擇這三種容器中的哪壹種應根據您的需求來決定,壹般應遵循以下幾點。
的原則:
1,如果需要高效的即時訪問,不考慮插入和刪除的效率,請使用vector。
2.如果妳需要大量的插入和刪除,並且不在乎立即訪問,妳應該使用list。
3.如果您需要立即訪問並關心兩端數據的插入和刪除,則應該使用deque。