源代碼之分布VC GCC
gnu 2.91 標(biāo)準(zhǔn)庫(kù)是用generic programming寫(xiě)成的,將data和methods分開(kāi)來(lái),借助iterator迭代器讓methods獲取data
list不能用::sort()排序是因?yàn)槿值膕ort要求傳入的iterator屬于random access iterator類(lèi)型,可以類(lèi)似指針一樣進(jìn)行+、-、*、/的操作,而list這種容器是由指針鏈接的一個(gè)個(gè)節(jié)點(diǎn)構(gòu)成,并不連續(xù),不能進(jìn)行+、-、*、/操作。
字符串默認(rèn)的比大小方式是字典序,不論長(zhǎng)度。
操作符重載
對(duì)于iterator來(lái)說(shuō),因?yàn)樗欠夯闹羔槪詫?duì)它需要重載可以用在指針上的各種操作符
模板
template <class T>或template <typename T>都可以
類(lèi)模板在使用時(shí)必須標(biāo)注類(lèi)型,而函數(shù)模板在使用時(shí)可以通過(guò)argument deduction實(shí)參推導(dǎo)
特化 template<>?
偏特化
多個(gè)模板參數(shù),只綁定其中一個(gè)
struct iterator_traits<T*>范圍上的偏特化
回歸到c語(yǔ)言的malloc,再調(diào)用操作系統(tǒng)API拿到內(nèi)存。
VC,BC,GNUC4.9下
allocate---->operator new---->malloc---->附加部分大小基本固定,其比例隨著所取內(nèi)存大小減小而增加,額外開(kāi)銷(xiāo)也增加
deallocate---->operator delete---->free
allocate<int>()臨時(shí)的int類(lèi)對(duì)象
GNUC2.9下更好的allocator,設(shè)計(jì)了16個(gè)鏈表,分別用于存儲(chǔ)整數(shù)倍8個(gè)字節(jié)的元素,元素最大可為8*16=128字節(jié),減少了調(diào)用太多次malloc所造成的cookie引起的開(kāi)銷(xiāo),在GNUC4.9下改名為_(kāi)_pool_alloc,用法:
list要內(nèi)存時(shí)以每個(gè)節(jié)點(diǎn)為單位,而每個(gè)節(jié)點(diǎn)包括了元素本身和指向前后節(jié)點(diǎn)的兩根指針
除了array和vector之外所有容器的iterator都必須是class,才能有“智能”,即iterator++會(huì)指向下一個(gè)節(jié)點(diǎn)。所有容器的iterator都至少有5個(gè)typedef,并且有一堆操作符重載
1.拷貝構(gòu)造=優(yōu)先于*,而=又北重在,使得*作為參數(shù)并沒(méi)有調(diào)用起重載后的*
2.因?yàn)閕nt++++的操作是不允許的,所以將i++的返回類(lèi)型設(shè)計(jì)為不帶引用。
代碼規(guī)范(從GNUC2.9到4.9版本)