Effective C++ 条款47
本節(jié)條款的題目:請(qǐng)使用trait classes來表示類型信息
本節(jié)條款主要講述的技術(shù)是怎樣在編譯期間實(shí)現(xiàn)對(duì)迭代器類型的推斷,依據(jù)推斷的類型進(jìn)行最優(yōu)處理。
我們先來看一下迭代器的種類:
1.input_iterator:僅僅讀,僅僅能逐個(gè)前移
2.output_iterator:僅僅寫,僅僅能逐個(gè)前移
3.forward_iterator:可讀可寫,僅僅能逐個(gè)前移
4.bidirectional_iterator:可讀可寫,支持逐個(gè)前移和后移
5.random_access_iterator:可讀可寫,支持隨機(jī)訪問(隨意步數(shù)移動(dòng))
假設(shè)一下,假設(shè)有一個(gè)函數(shù)用于對(duì)迭代器指定移動(dòng)次數(shù)d,我們?cè)鯓訉?shí)現(xiàn)這個(gè)函數(shù),以達(dá)到最理想的狀態(tài)。
我們肯定會(huì)處理迭代器是random access類型的情況和不是random access類型的情況。當(dāng)時(shí)random access的時(shí)候,直接加減迭代器在常數(shù)時(shí)間內(nèi)完畢,假設(shè)不是,僅僅能一步一步向前或向后移動(dòng)。
例如以下代碼:
但是,我們?cè)趺床鸥勺龅健癷ter is a random access iterator”在編譯期間的實(shí)現(xiàn)?
實(shí)現(xiàn)這個(gè)功能。須要下面幾步,而且相對(duì)繁雜的幾步。
首先為每一種迭代器設(shè)置struct標(biāo)簽,每一個(gè)struct都是空的結(jié)構(gòu)體,例如以下代碼:
struct input_iterator_tag{};struct output_iterator_tag{};struct forward_iterator_tag: public input_iterator_tag{};struct bidirectional_iterator: public forward_iterator_tag{};struct random_access_iterator: public bidirectional_iterator_tag{};接著。我們就要引入traits,traits是一種技術(shù),我們通過程序來看一下這是什么技術(shù)。有什么用。
我們來看一下關(guān)于各種容器的定義:
從上面代碼能夠看出,每一個(gè)容器中都有一個(gè)iterator類。但是每一個(gè)iterator類中的迭代器標(biāo)簽卻不一樣。
當(dāng)我們調(diào)用語句vector<int>::iterator::iterator_category時(shí)會(huì)返回random_access_iterator類的類型,當(dāng)我們調(diào)用list<int>::iterator::iterator_category時(shí)會(huì)返回bidirectional_iterator類的類型。
我們?cè)賮砜匆幌掠嘘P(guān)iterator_traits結(jié)構(gòu)體的定義,
假設(shè)我們通過語句iterator_traits<vector<int>::iterator>::iterator_category調(diào)用就會(huì)返回有關(guān)vector<int>迭代器iterator的類型,該語句返回random_access_iterator類型。
同理iterator_traits<list<int>::iterator>::it
總結(jié)
以上是生活随笔為你收集整理的Effective C++ 条款47的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 性能监测:Memory
- 下一篇: 《Windows Server 2012