Boolan STL與泛型程式設計 第四周筆記

2021-08-02 15:48:06 字數 2521 閱讀 1788

stl六大部件從語言層面講:

algorithms看不見containers,對其一無所知;所以它需要的一切資訊都必須從iterators取得,而iterators(由containers**)必須能夠回答algorithm的所有提問,才能搭配該algorithm的所有操作。

一般stl中的演算法都是以下兩種形式(其中的algorithm是一種泛指,可以替代其他的函式名稱)

templatealgorithm (iterator itr1, iterator itr2)

templatealgorithm (iterator itr1, iterator itr2, cmp comp)

因為演算法對容器的操作必須通過迭代器來進行,在進行演算法的討論之前有必要對迭代器進行分類。

迭代器由容器來提供,各種容器的iterators的5種iterator_category如下:

除了output_iterator_tag,其餘四個之間是繼承關係。

(1)通過iterator_traits可以將容器傳入的迭代器區分出種類:

(2)通過使用typeid函式來實現迭代器型別的列印:

前面說過演算法需要迭代器的資訊;而不同的演算法對於不同的物件進行操作的時候,往往需要根據具體的情況處理。因此,在標準庫中,我們表面上看到的演算法都是接收迭代器就可以了,實際上演算法在與操作物件的交流中早就知道了迭代器的型別,並且根據這個型別做出了不同的判斷。這個判斷的過程,一般是通過traits來實現的。 

為了實現上述的思想,演算法的結構可以大致表現為兩個部分:

下面以具體的例子進行說明。

(1)distance函式

distance函式用於計算兩個迭代器之間的距離,具體的源**如下:

templateinline iterator_traits::difference_type

_distance(inputiterator first, inputiterator last, input_iterator_tag)

return n;}

templateinline iterator_traits::difference_type

_distance(randomaccessiterator first, randomaccessiterator last,

random_access_iterator_tag)

//--------------------------------------

templateinline iterator_traits::difference_type

distance(inputiterator first, inputiterator last)

繼承binary_function的意義在於,告訴演算法傳進來的是二元運算。仿函式在傳遞進演算法的時候,需要告訴演算法兩個參與運算的型別,以及乙個用於接受結果的型別。

如果沒有繼承,在某些場合也可以使用,但是當我們需要修改或者適配它本身的時候很可能就會出問題。

介面卡按照型別的不同,可分為容器介面卡、迭代器介面卡和仿函式介面卡三種,具體如下圖所示:

容器介面卡:stack、queue

template>

class stack

size_type size() const

reference top()

const_reference top() const

void push (const value_type& x)

void pop()

}template >

class queue

size_type size() const

reference front()

const_reference front() const

reference back()

const_reference back() const

void push (const value_type& x)

void pop()

}

函式介面卡:binder2nd

函式介面卡:not1

Boolan STL與泛型程式設計 第一周筆記

泛型程式設計 一 我們的目標 level 0 使用c 標準庫 level1 認識c 標準庫 胸中自由丘壑 level2 良好使用c 標準庫 level3 擴充c 標準庫 c standard library vs.standard template library stl 前者包含後者 c 標準庫的...

模板與泛型程式設計

模板是泛型變成的基礎。泛型程式設計 編譯與型別無關的 是一種復用的方式,模板分為模板函式和模板類。模板函式是乙個通用的函式模板,而不是為每一種型別定義乙個新函式,乙個函式模板就像乙個公式,針對不同型別函式生成不同的函式版本。關鍵字 template 以 template 開始,後面跟乙個模板引數列表...

模板與泛型程式設計

泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎。函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。模板的格式 template 返回值型別 函式名 引數列表 模板分為類模板和函式模板 模板它本身並不是函式,是編譯...