C++箴言:為類型信息使用特征類

字號(hào):

STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)構(gòu)成的,但是也有幾個(gè) utility templates(實(shí)用模板)。其中一個(gè)被稱為 advance。advance 將一個(gè)指定的 iterator(迭代器)移動(dòng)一個(gè)指定的距離:
    template // move iter d units
    void advance(IterT& iter, DistT d); // forward; if d < 0,
    // move iter backward
    在概念上,advance 僅僅是在做 iter += d,但是 advance 不能這樣實(shí)現(xiàn),因?yàn)橹挥?random access iterators(隨機(jī)訪問迭代器)支持 += operation。不夠強(qiáng)力的 iterator(迭代器)類型不得不通過反復(fù)利用 ++ 或 -- d 次來實(shí)現(xiàn) advance。
    你不記得 STL iterator categories(迭代器種類)了嗎?沒問題,我們這就做一個(gè)簡單回顧。對(duì)應(yīng)于它們所支持的操作,共有五種 iterators(迭代器)。input iterators(輸入迭代器)只能向前移動(dòng),每次只能移動(dòng)一步,只能讀它們指向的東西,而且只能讀一次。它們以一個(gè)輸入文件中的 read pointer(讀指針)為原型;C++ 庫中的 istream_iterators 就是這一種類的典型代表。output iterators(輸出迭代器)與此類似,只不過用于輸出:它們只能向前移動(dòng),每次只能移動(dòng)一步,只能寫它們指向的東西,而且只能寫一次。它們以一個(gè)輸出文件中的 write pointer(寫指針)為原型;ostream_iterators 是這一種類的典型代表。這是兩個(gè)最不強(qiáng)力的 iterator categories(迭代器種類)。因?yàn)?input(輸入)和 output iterators(輸出迭代器)只能向前移動(dòng)而且只能讀或者寫它們指向的地方最多一次,它們只適合 one-pass 運(yùn)算。
    一個(gè)更強(qiáng)力一些的 iterator category(迭代器種類)是 forward iterators(前向迭代器)。這種 iterators(迭代器)能做 input(輸入)和 output iterators(輸出迭代器)可以做到的每一件事情,再加上它們可以讀或者寫它們指向的東西一次以上。這就使得它們可用于 multi-pass 運(yùn)算。STL 沒有提供 singly linked list(單向鏈表),但某些庫提供了(通常被稱為 slist),而這種 containers(容器)的 iterators(迭代器)就是 forward iterators(前向迭代器)。TR1 的 hashed containers(哈希容器)的 iterators(迭代器)也可以屬于 forward category(前向迭代器)。
    bidirectional iterators(雙向迭代器)為 forward iterators(前向迭代器)加上了和向前一樣的向后移動(dòng)的能力。STL 的 list 的 iterators(迭代器)屬于這一種類,set,multiset,map 和 multimap 的 iterators(迭代器)也一樣。
    力的 iterator category(迭代器種類)是 random access iterators(隨機(jī)訪問迭代器)。這種 iterators(迭代器)為 bidirectional iterators(雙向迭代器)加上了 "iterator arithmetic"(“迭代器運(yùn)算”)的能力,也就是說,在常量時(shí)間里向前或者向后跳轉(zhuǎn)一個(gè)任意的距離。這樣的運(yùn)算類似于指針運(yùn)算,這并不會(huì)讓人感到驚訝,因?yàn)?random access iterators(隨機(jī)訪問迭代器)就是以 built-in pointers(內(nèi)建指針)為原型的,而 built-in pointers(內(nèi)建指針)可以和 random access iterators(隨機(jī)訪問迭代器)有同樣的行為。vector,deque 和 string 的 iterators(迭代器)是 random access iterators(隨機(jī)訪問迭代器)。
    對(duì)于五種 iterator categories(迭代器種類)中的每一種,C++ 都有一個(gè)用于識(shí)別它的 "tag struct"(“標(biāo)簽結(jié)構(gòu)體”)在標(biāo)準(zhǔn)庫中:
    struct input_iterator_tag {};
    struct output_iterator_tag {};
    struct forward_iterator_tag: public input_iterator_tag {};
    struct bidirectional_iterator_tag: public forward_iterator_tag {};
    struct random_access_iterator_tag: public bidirectional_iterator_tag {};
    這些結(jié)構(gòu)體之間的 inheritance relationships(繼承關(guān)系)是正當(dāng)?shù)?is-a 關(guān)系:所有的 forward iterators(前向迭代器)也是 input iterators(輸入迭代器),等等,這都是成立的。我們不久就會(huì)看到這個(gè) inheritance(繼承)的功用。