2 vector 和 string
使用 new 動态配置設定記憶體時必須承擔的責任:
確定以後用 delete 删除所配置設定的記憶體。
確定使用正确的 delete 形式。
確定隻 delete 了一次。
普通數組的缺點:
沒有提供 begin、end、size 這樣的成員函數。
沒有 iterator、reverse_iterator、value_type 這樣的嵌套類型定義。
使用 vector 和 string 可以減輕自己的負擔。
vector 和 string 的自動增長機制:
配置設定:配置設定一塊大小為目前容量的某個倍數的新記憶體。vector 和 string 一般為 2.
把容器的所有元素從舊的記憶體複制到新的記憶體。
析構掉舊記憶體中的對象。
釋放舊記憶體。
size():告訴你該容器中有多少個元素。
capacity():告訴你該容器利用已經配置設定的記憶體可以容納多少個元素。這是容器所能容納的元素總數。
resize(Container::size_type n):強迫容器改變到包含 n 個元素的狀态。在調用 resize 之後,size 将傳回 n。
reserve(Container::size_type n):強迫容器把它的容量變為至少是 n,前提是 n 不小于目前的大小。
使用 reserve,簡單預留适合大小的空間,避免循環過程中發生重新配置設定:
對 push_back 的調用不會使 string 中的疊代器、指針和引用無效:
每個 string 包含的資訊:
字元串的大小(size),即它所包含的字元個數。
存儲該字元串中字元的記憶體容量(capacity)。
字元串的值(value),即構成該字元串的字元。
可選:
配置設定子的拷貝。
對值的引用計數。
P56-P59

C++标準要求 vector 中的元素存儲在連續的記憶體中,就像數組一樣,是以可以直接得到容器中的資料指針。
對于 vector v; 表達式 v[0] 給出了一個引用,它是該向量中的第一個元素,是以 &v[0] 是指向第一個元素的指針。
&*v.begin() 等價于 &v[0]
對于 string,由于 string 中的資料不一定存儲在連續的記憶體中且 string 的内部表示不一定是以空字元結尾,需使用成員函數 c_str()。
P62
shrink to fit:為了避免向量仍占用不再需要的記憶體,你希望有一種方法能把它的容量從以前的最大值縮減到目前需要的數量。
從 contestants 向量中除去多餘的容量:
vector 的拷貝構造函數隻為說拷貝的元素配置設定所需要的記憶體,是以這個臨時變量沒有多餘的容量。
swap:臨時變量的資料和 contestents 的資料做 swap 操作。在這之後,contestents 具有了被去除之後的容量,即原先臨時變量的容量。臨時變量随後被析構,進而釋放先前為 contestents 所占據的記憶體。注意,疊代器、指針和引用也将被交換(string 除外)。
同樣适用于 string
清除一個容器:
vector 是一個假的容器:
它不是一個 STL 容器。
它并不存儲 bool。為了節省空間,它儲存的是 bool 的緊湊表示——使用了與位域(bitfield)一樣的思想,一個 8 位的位元組可容納 8 個 “bool”。你可以建立一個指向 bool 的指針,而指向單個位的指針則是不允許的。指向單個位的引用也是被禁止的。
vector::operator[] 傳回一個對象,表現得像是一個指向單個位的引用,即所謂的代理對象(proxy object)。
vector 的替代方案:
deque:deque 是一個 STL 容器,而且它确實存儲 bool。但 deque 中元素的記憶體不是連續的。
bitset:bitset 不是 STL 容器,它的大小(元素的個數)在編譯時就确定了,是以它不支援疊代器。與 vector 一樣,它使用了一種緊湊表示,隻為所包含的每個值提供一位空間。
總之,vector 是一個失敗了的雄心勃勃的實驗,它不完全滿足 STL 容器的要求;你最好不要使用它;你可以使用 deque 和 bitset 來替代它,這兩個資料結構幾乎能做 vector 所能做的一切事情。