空間分配器:
SGI STL提供了一個標(biāo)準(zhǔn)的配置器接口,接口是simple_alloc,只不過是把它做了一層隱藏。
SGI STL配置器其名稱是alloc而非allocator,而且不接受任何參數(shù)。因此在使用時不能寫成標(biāo)準(zhǔn)的寫法:
vector<int,std::allocator<int> iv;
應(yīng)寫成
vector<int,std::alloc> iv
迭代器與traits技巧
STL的核心在于:將數(shù)據(jù)容器(containers)和算法(algorithms)分開,彼此獨立設(shè)計,最后再以一貼膠著劑將其合并。容器和算法的泛型化可以通過classtemplate和function templates分別達到目標(biāo)。設(shè)計兩者之間的膠著劑則是最大的問題。
迭代器(iterator)是一種smartpointer.
Partial specialization(偏特化)的意義:
如果classtemplate擁有一個以上的template參數(shù),可以針對其中部分(一個或者幾個,但非全部)template參數(shù)進行特化工作。換句話說,可以在泛化設(shè)計中提供一個特化版本。<<泛型思維>>對Partialspecialization的定義:“針對任何template參數(shù)更進一步的條件限制所設(shè)計出來的一個特化版本”.
迭代器類型之一:value type
迭代器類型之二:difference type
迭代器類型之三:reference type
迭代器類型之四:pointer type
迭代器類型之五:iterator_category
容器(containers):序列式容器(sequence containers)和關(guān)聯(lián)式容器(associatecontainers)
序列式容器(sequence containers):
vector:
at() 函數(shù) 返回當(dāng)前Vector指定位置loc的元素的引用. at() 函數(shù) 比 [] 運算符更加安全,因為它不會讓你去訪問到Vector內(nèi)越界的元素.
list:
merge() 合并兩個list
remove_if() 按指定條件刪除元素
sort() 給list排序
splice() 合并兩個list
unique() 刪除list中重復(fù)的元素
deque:
采用一塊所謂的map(注意,不是STL的map容器)作為主控。這里所謂map是一小塊連續(xù)空間,其中每個元素(此處稱為一個節(jié)點,node)都是指針,指向另一段連續(xù)線性空間,稱為緩沖區(qū)。緩沖區(qū)才是deque的內(nèi)存。
stack:
允許新增元素,移除元素,取得最頂端元素.但除了最頂端外,沒有任何其他方法可以存取stack的其他元素.stack不提供走訪功能,也不提供迭代器。
SGI STL便以deque作為缺省情況下的stack底部結(jié)構(gòu)。STLstack往往不被歸為container(容器),而被歸為container adapter. List也可以作為stack的底層容器。
queue:
以SGI STL 的deque為缺省接口。
heap:
heap并不歸屬STL容器組件,它是個幕后英雄,扮演priority queue的助手。
關(guān)聯(lián)式容器(associate containers):
標(biāo)準(zhǔn)的STL關(guān)聯(lián)式容器分為set集合和map集合,以及這兩大類的衍生體multiset和multimap,這些容器都是以RB-tree為底層機制完成。此外SGISTL 還提供了一個不在標(biāo)準(zhǔn)規(guī)格之列的關(guān)聯(lián)式容器:hash table 以及以hashtable為底層機制的hash_set,hash_map,hash_multiset,hash_multimap.
一般而言,關(guān)聯(lián)式容器的內(nèi)部結(jié)構(gòu)是一個balanced binary tree(平衡二叉樹),以便獲得良好的搜尋效率。balancedbinary tree有許多類型,包括AVL-tree,RB-tree,AA-tree。
RB-tree提供兩種插入操作:insert_unique()和insert_equal(),前者表示被插入的節(jié)點的鍵值key必須是唯一的,后者表示可以重復(fù)。
注意:RB-tree一開始就要求指定所謂的KeyOfValue仿函數(shù),用來從value中提取key值。
對于關(guān)聯(lián)式容器,使用其本身所提供的find函數(shù)查找比使用STL算法find更有效率,因為stl算法find()只是循序搜尋。企圖通過迭代器來改變set是不允許的,因為set的所有迭代器都是只讀的迭代器。
map:
map的所有元素都是pair,同時擁有value和key,第一個元素被視為鍵值,第二個元素被視為實值。Map不允許兩個元素有相同的key。因為map元素的key值關(guān)系到map的元素排列規(guī)則,因此是不能修改它其宗的key值,這樣會破壞map組織。但是可以修改value值。
hash_set:
以hashtable為底層機制,其沒有自動排序功能。
hash_map:
以hashtable為底層機制,其沒有自動排序功能。
STL 算法
所有的STL算法都作用在由迭代器[first,last)所標(biāo)出的區(qū)間上,所謂質(zhì)變算法,指運算過程中會更改區(qū)間內(nèi)(迭代器所指)的元素內(nèi)容.
許多STL算法不只支持一個版本,這一類算法的某個版本采用缺省運算行為,另一個版本提供額外參數(shù),接受外界傳入一個仿函數(shù)(functor).有些算法直接這樣區(qū)分不同的版本,附從的那個總是以_if作為結(jié)尾。如replace(),使用內(nèi)建的equality操作符進行比對操作,replace_if()則以接受到得仿函數(shù)()進行比較行為。
質(zhì)變算法通常提供兩個版本:一個是in-place版,就地改變其操作對象;另一個是Copy版本,將操作對象的內(nèi)容復(fù)制一份版本,然后在副本上進行修改并返回該副本。