C++ Template 筆記關(guān)于C++ Template這本書,作者是David VandeVoorde與 Nicolai M. Josuttis.書籍的鏈接STL 筆記1空間分配器:
SGI STL提供了一個標(biāo)準(zhǔn)的配置器接口,接口是simple_alloc,只不過是把它做了一層隱藏。 SGI STL配置器其名稱是alloc而非allocator,而且不接受任何參數(shù)。因此在使用時不能寫成標(biāo)準(zhǔn)的寫法: 應(yīng)寫成 迭代器與traits技巧 容器(containers):序列式容器(sequence containers)和關(guān)聯(lián)式容器(associate containers) 序列式容器(sequence containers): vector: at() 函數(shù) 返回當(dāng)前Vector指定位置loc的元素的引用. at() 函數(shù) 比 [] 運(yùn)算符更加安全, 因為它不會讓你去訪問到Vector內(nèi)越界的元素. list: merge() remove_if() sort() splice() unique() deque: stack: SGI STL便以deque作為缺省情況下的stack底部結(jié)構(gòu)。STL stack往往不被歸為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為底層機(jī)制完成。此外SGI STL 還提供了一個不在標(biāo)準(zhǔn)規(guī)格之列的關(guān)聯(lián)式容器:hash table 以及以hash table為底層機(jī)制的hash_set,hash_map,hash_multiset,hash_multimap. 一般而言,關(guān)聯(lián)式容器的內(nèi)部結(jié)構(gòu)是一個balanced binary tree(平衡二叉樹),以便獲得良好的搜尋效率。balanced binary tree有許多類型,包括AVL-tree,RB-tree,AA-tree。 RB-tree提供兩種插入操作:insert_unique()和insert_equal(),前者表示被插入的節(jié)點(diǎn)的鍵值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,第一個元素被視為鍵值,第二個元素被視為實(shí)值。Map不允許兩個元素有相同的key。因為 map元素的key值關(guān)系到map的元素排列規(guī)則,因此是不能修改它其宗的key值,這樣會破壞map組織。但是可以修改value值。 hash_set: 以hashtable為底層機(jī)制,其沒有自動排序功能。 hash_map: 以hashtable為底層機(jī)制,其沒有自動排序功能。 STL 算法 所有的STL算法都作用在由迭代器[first,last)所標(biāo)出的區(qū)間上,所謂質(zhì)變算法,指運(yùn)算過程中會更改區(qū)間內(nèi)(迭代器所指)的元素內(nèi)容. 許多STL算法不只支持一個版本,這一類算法的某個版本采用缺省運(yùn)算行為,另一個版本提供額外參數(shù),接受外界傳入一個仿函數(shù)(functor).有些算法 直接這樣區(qū)分不同的版本,附從的那個總是以_if作為結(jié)尾。如replace(),使用內(nèi)建的equality操作符進(jìn)行比對操 作,replace_if()則以接受到得仿函數(shù)()進(jìn)行比較行為。 質(zhì)變算法通常提供兩個版本:一個是in-place版,就地改變其操作對象;另一個是Copy版本,將操作對象的內(nèi)容復(fù)制一份版本,然后在副本上進(jìn)行修改并返回該副本。 |
|