青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Coder

I am a humble coder.

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  4 隨筆 :: 4 文章 :: 9 評論 :: 0 Trackbacks

在調用算法函數的時候,有時候會把不同序列的迭代器當成同一序列使用。
下面提供避免這樣錯誤的一種機制。
本內容來自TCPL(特別版)

有時候,我們會犯這樣的錯誤,把兩個不同序列的迭代器去構成一個序列了。比如:

void ?f(list < string >& ?fruit,?list < string >& ?citrus)
{
?typedef?list
< string > ::const_iterator?LI;

?LI?p1?
= ?find(fruit.begin(),?citrus.end(),? " apple " );? // ?error,?不在同一序列
?LI?p2? = ?find(fruit.begin(),?fruit.end(),? " apple " );
?LI?p3?
= ?find(citrus.begin(),?citrus.end(),? " pear " );
?LI?p4?
= ?find(p2,?p3,? " peach " );? // ?這個更加隱蔽。
}

這里Bjarne Stroustrup給出一個解決問題的途徑。其關鍵就是用整個容器代替x.begin, x.end()的輸入。
這樣,我們要封裝兩個東西,1、find()函數。 2、begin(),end()

利用重載,封裝find函數。

template < class ?In,? class ?T > ?
In?find(Iseq
< In > ?r,? const ?T & ?v)?? // 通過重載機制,得到這個find的擴充版本。
{
????
return ?find(r.first,?r.second,?v);? // 標準庫中的find
};

?

利用對偶,封裝迭代器。
首先,我們構造一個Iseq以保證迭代器是統一序列成對輸入的。

template < class ?In > struct ?Iseq:? public ?pair < In,?In > {
????Iseq(In?i1,?In?i2):?pair
< In,?In > (i1,?i2){}
};

?

接著構造一個協助函數,直接傳遞容器。

template < class ?C > Iseq < typename?C::iterator > ?iiseq(C & ?c)? // C為容器
{
????
return ?Iseq < typename?C::iterator > (c.begin(),?c.end());
}


這樣,我們可以利用上面的機制,來避免所提出的錯誤。

void ?f(list < string >& ?fruit,?list < string >& ?citrus)
{
?typedef?list
< string > ::const_iterator?LI;

?LI?p1?
= ?find(iiseq(fruit),? " apple " );?
?LI?p2?
= ?find(iiseq(citrus),? " apple " );
?LI?p3?
= ?find(citrus.begin(),?citrus.end(),? " pear " );? //
}

?

下面我們仔細分析整個機制的幾個細節。
先讓我們來看看pair的樣子。

template < class ?T1,? class ?T2 > struct ?std::pair{? // 這里用struct來定義
????typedef?T1?first_type;
????typedef?T2?second_type;

????T1?first;
????T2?second;

????pair():?first(T1()),?second(T2()){}
????pair(
const ?T1 & ?x,? const ?T2 & ?y):?first(x),?second(y){}
????template
< class ?U,? class ?v >
????????pair(
const ?pair < U,?V >& ?p):?first(p.first),?second(p.second){}
????
//
};

注意pair的兩個數據成員first, second都是public的,所以Iseq繼承pair之后可以直接訪問。

考察find()函數的重載版本
find(Iseq<In> r, const T& v)
注意“Iseq<In> r”使用值傳遞,而不用引用傳遞(Iseq<In>& r)。
這是因為iiseq協助函數返回一個臨時對象,所以在find中,不能用引用傳遞。
template<class C>Iseq<typename C::iterator> iiseq(C& c) //C為容器
{
?return Iseq<typename C::iterator>(c.begin(), c.end());
}
大家可能會考慮到效率問題,覺得值傳遞可能不妥。其實不然,我們可以發現,Iseq里面的數據成員是兩個Iterator,一般來說不是很大(有時,就是兩個指針),在效率上不會產生很大的影響。

還有這里代碼中出現typename,(如return Iseq<typename C::iterator>(c.begin(), c.end());) 可能對初學者來說有些生疏。為什么不直接寫: Iseq<C::iterator>(c.begin(), c.end())。這是由于編譯器不能直接認出C::iterator是一種類型,所以我們加上修飾符號typename告訴編譯器C::iterator使用一種類型。


?

posted on 2006-06-02 22:25 TH 閱讀(222) 評論(0)  編輯 收藏 引用 所屬分類: STL和標準函數庫
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久先锋影音| 国产麻豆91精品| 亚洲精品国偷自产在线99热| 午夜欧美大片免费观看 | 亚洲另类自拍| 99精品欧美一区二区三区| 日韩亚洲综合在线| 亚洲欧美激情诱惑| 久久理论片午夜琪琪电影网| 免费不卡在线观看av| 欧美成人亚洲成人日韩成人| 欧美日本簧片| 国产欧美日韩亚洲精品| 好看不卡的中文字幕| 亚洲黄色av一区| 亚洲少妇最新在线视频| 欧美一区二区三区在线观看视频 | 久久久天天操| 亚洲第一黄网| 亚洲一区在线观看视频 | 午夜精品短视频| 久久综合给合久久狠狠色| 亚洲第一二三四五区| 99精品视频一区| 久久精品视频免费播放| 欧美日韩成人一区二区| 国产亚洲精品7777| 99精品热视频| 久久久高清一区二区三区| 亚洲国产欧美一区| 午夜精品久久久| 欧美日韩高清一区| 在线成人小视频| 欧美伊久线香蕉线新在线| 亚洲高清免费| 亚洲摸下面视频| 欧美日本国产| 亚洲精品中文字幕在线观看| 欧美一区二区三区在线播放| 亚洲美女在线视频| 欧美成人午夜视频| 亚洲高清免费在线| 久久综合国产精品| 亚洲精品网址在线观看| 国产精品久久久久久超碰| 国产麻豆日韩欧美久久| 一本久久综合亚洲鲁鲁五月天| 久久国产66| 亚洲一区二区三区在线播放| 欧美激情免费在线| 在线观看视频一区| 久久精品一本久久99精品| 亚洲一区二区三区精品在线| 欧美人与性禽动交情品| 亚洲国产日韩欧美| 久久精品国产视频| 亚洲——在线| 国产精品欧美一区喷水| 一区二区三区日韩在线观看| 亚洲激情视频在线| 欧美激情视频免费观看| 99精品视频一区| 亚洲国产一区二区三区青草影视| 欧美一区二视频在线免费观看| 欧美视频在线观看一区二区| 国产精品99久久99久久久二8| 欧美激情亚洲另类| 你懂的国产精品| 亚洲国产精品尤物yw在线观看 | 激情欧美日韩一区| 欧美在线关看| 欧美影院在线播放| 在线观看免费视频综合| 欧美v亚洲v综合ⅴ国产v| 久久这里只有精品视频首页| 亚洲国产成人精品女人久久久| 六月天综合网| 欧美高清在线视频观看不卡| 亚洲国产高清在线| 亚洲国产欧美日韩精品| 欧美色欧美亚洲另类二区| 欧美一区二区三区免费大片| 欧美伊人久久| 日韩视频在线观看| 亚洲视频综合在线| 国产综合色一区二区三区| 欧美成人精品h版在线观看| 欧美91视频| 亚洲欧美日韩直播| 久久成人免费网| 亚洲精品久久久久久久久久久久久 | 亚洲永久在线观看| 欧美在线网址| 一区二区三区精密机械公司| 亚洲在线日韩| 最新亚洲电影| 一区二区欧美日韩视频| 激情久久久久久久久久久久久久久久| 狂野欧美激情性xxxx欧美| 欧美日韩国产欧美日美国产精品| 欧美91精品| 欧美成人嫩草网站| 西瓜成人精品人成网站| 欧美成人国产| 久久精品日韩欧美| 欧美日韩另类在线| 久色婷婷小香蕉久久| 国产精品xxxxx| 欧美本精品男人aⅴ天堂| 国产精品久久久999| 你懂的网址国产 欧美| 国产精品美女久久久免费| 亚洲国产乱码最新视频| 国产一区二区精品久久91| 日韩小视频在线观看专区| 狠狠v欧美v日韩v亚洲ⅴ| 这里是久久伊人| 亚洲精品免费看| 香蕉乱码成人久久天堂爱免费| 在线不卡免费欧美| 亚洲在线播放| 午夜精品久久久久久99热软件 | 亚洲欧美一区二区三区久久| 91久久精品网| 久久久噜久噜久久综合| 久久精品观看| 国产欧美日韩精品专区| 亚洲视频中文| 亚洲午夜日本在线观看| 欧美日韩亚洲一区二区三区四区| 亚洲电影在线播放| 亚洲精品一区二区三区婷婷月 | 日韩视频―中文字幕| 久久综合九色综合欧美就去吻| 欧美一级理论性理论a| 国产精品入口| 亚洲在线观看视频| 亚久久调教视频| 国产麻豆9l精品三级站| 亚洲欧美激情一区二区| 久久精品国产第一区二区三区最新章节 | **欧美日韩vr在线| 久久久精品日韩欧美| 久久综合伊人77777| 国内一区二区三区在线视频| 亚洲欧美自拍偷拍| 久久久中精品2020中文| 亚洲区一区二| 一区二区三区成人精品| 亚洲午夜一区| 国产精品一区视频| 欧美在线视频免费| 欧美激情国产高清| 中文在线资源观看网站视频免费不卡| 欧美日韩一区在线| 亚洲欧美国产高清va在线播| 黄网站免费久久| 国产精品免费电影| 午夜在线视频观看日韩17c| 久久精品女人的天堂av| 精品不卡一区| 欧美mv日韩mv国产网站| 亚洲黄色毛片| 国产精品激情| 欧美专区日韩专区| 亚洲高清二区| 欧美一级久久| 亚洲精品美女在线观看| 国产精品久久久久婷婷| 久久久久www| 91久久精品一区| 亚洲国产综合91精品麻豆| 亚洲第一区在线| 欧美视频一区| 久久一区二区三区四区五区| 日韩午夜电影| 欧美va天堂| 午夜在线观看欧美| 亚洲人成网在线播放| 久久国产精品一区二区三区四区| 亚洲精品国产精品国自产观看| 国产精品亚洲一区| 欧美极品一区| 久久精品五月| 亚洲在线中文字幕| 亚洲激情视频网| 女人香蕉久久**毛片精品| 亚洲伊人网站| 日韩亚洲精品在线| 亚洲成人中文| 国产一区二区中文| 亚洲先锋成人| 亚洲欧洲一区二区三区久久| 久久久噜噜噜久久狠狠50岁| 亚洲视频一二区| 亚洲精品综合精品自拍| 激情文学一区| 黄色日韩网站视频| 狠狠色狠狠色综合日日五| 亚洲精品视频在线播放|