日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Effective C++ 条款47

發(fā)布時(shí)間:2024/9/21 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective C++ 条款47 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本節(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)。


例如以下代碼:

template<typename Iter, typename DistT>void advance(IteT& iter,DistT d){if(iter is a random access iterator)iter+=d;else{if(d>=0)while(d--) ++iter;else while(d++) --iter;}}

但是,我們?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)于各種容器的定義:

template class <T> class vector { public:class iterator{public:typedef random_access_iterator iterator_category;…}… }template class <T> class list { public:class iterator{public:typedef bidirectional_iterator iterator_category;…}… }

從上面代碼能夠看出,每一個(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)體的定義,

template<typename IterT>struct iterator_traits{typedef typename IterT::iterator_category iterator_category;//typedef typename的使用見條款42};

假設(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

posted @ 2017-05-02 14:30 llguanli 閱讀(...) 評(píng)論(...) 編輯 收藏

總結(jié)

以上是生活随笔為你收集整理的Effective C++ 条款47的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。