C Primer讀書筆記(七)

2021-05-26 21:12:33 字數 1463 閱讀 6003

stl 中 string list deque vector set map 容器的區別

在stl中基本容器有: string、vector、list、deque、set、map

set 和map都是無序的儲存元素,只能通過它提供的介面對裡面的元素進行訪問

set:集合, 用來判斷某乙個元素是不是在乙個組裡面,使用的比較少

map:對映,相當於字典,把乙個值對映成另乙個值,如果想建立字典的話使用它好了

string、vector、list、deque、set 是有序容器 

1.string 

string 是basic_string的實現,在記憶體中是連續存放的.為了提高效率,都會有保留記憶體,如string s= "abcd",這時s使用的空間可能就是255, 當string再次往s裡面新增內容時不會再次分配記憶體.直到內容》255時才會再次申請記憶體,因此提高了它的效能.

當內容》255時,string會先分配乙個新記憶體,然後再把內容複製過去,再複製先前的內容.

對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返回值,還有其它操作後的返回值

2.vector 

vector就是動態陣列.它也是在堆中分配記憶體,元素連續存放,有保留記憶體,如果減少大小後記憶體也不會釋放.如果新值》當前大小時才會再分配記憶體 

對最後元素操作最快(在後面新增刪除最快 ), 此時一般不需要移動記憶體,只有保留記憶體不夠時才需要

對中間和開始處進行新增刪除元素操作需要移動記憶體,如果你的元素是結構或是類,那麼移動的同時還會進行構造和析構操作,所以效能不高

(最好將結構或類的指標放入vector中,而不是結構或類本身,這樣可以避免移動時的構造與析構)。

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...