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

The Coder

I am a humble coder.

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

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

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

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給出一個解決問題的途徑。其關(guān)鍵就是用整個容器代替x.begin, x.end()的輸入。
這樣,我們要封裝兩個東西,1、find()函數(shù)。 2、begin(),end()

利用重載,封裝find函數(shù)。

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

?

利用對偶,封裝迭代器。
首先,我們構(gòu)造一個Iseq以保證迭代器是統(tǒng)一序列成對輸入的。

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

?

接著構(gòu)造一個協(xié)助函數(shù),直接傳遞容器。

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 " );? //
}

?

下面我們仔細(xì)分析整個機制的幾個細(xì)節(jié)。
先讓我們來看看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的兩個數(shù)據(jù)成員first, second都是public的,所以Iseq繼承pair之后可以直接訪問。

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

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


?

posted on 2006-06-02 22:25 TH 閱讀(222) 評論(0)  編輯 收藏 引用 所屬分類: STL和標(biāo)準(zhǔn)函數(shù)庫
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩午夜高潮| 国产伦精品一区二区三区高清版| 欧美在线精品一区| 亚洲精品久久久久久一区二区| 国产精品成人一区二区艾草| 蜜桃久久av| 欧美激情久久久久久| 另类av导航| 牛牛影视久久网| 欧美一区二区三区四区高清| 亚洲欧美高清| 久久不射中文字幕| 久久久水蜜桃| 欧美福利在线观看| 国产精品v欧美精品v日韩| 欧美日韩一级黄| 国产一区二区三区免费不卡| 亚洲少妇自拍| 在线亚洲精品| 乱码第一页成人| 欧美日韩国产色综合一二三四| 欧美日韩在线视频一区| 国产精品综合不卡av| 在线播放中文一区| 国产在线观看91精品一区| 国产欧美日韩免费| 99视频热这里只有精品免费| 欧美一区二区三区在线观看| 欧美不卡视频一区| 在线成人www免费观看视频| 久久久久久久999| 欧美电影美腿模特1979在线看 | 亚洲国产精品嫩草影院| 欧美国产日韩xxxxx| 欧美专区日韩视频| 亚洲人体影院| 亚洲国产aⅴ天堂久久| 国产精品九色蝌蚪自拍| 在线播放日韩欧美| 久久精品国产第一区二区三区最新章节 | 久久在精品线影院精品国产| 国产视频观看一区| 亚洲宅男天堂在线观看无病毒| 亚洲最新在线| 欧美在现视频| 国产一区二区丝袜高跟鞋图片| 亚洲美女在线视频| 亚洲国产成人av在线| 日韩视频久久| 国产欧美日韩| 欧美成人免费网| 一区二区亚洲| 亚洲大片在线| 国产精品第13页| 久久精品国产综合| 久久一区激情| 亚洲在线成人精品| 久久成人18免费网站| 国产热re99久久6国产精品| 久久久久久久久久久久久久一区 | 亚洲深夜福利| 国产一区二区电影在线观看| 欧美国产丝袜视频| 国产精品欧美在线| 亚洲第一天堂av| 欧美久久九九| 亚洲一区综合| 欧美ed2k| 久久精品国产免费观看| 欧美电影专区| 免费成人高清在线视频| 国产精品日日做人人爱 | 国产亚洲福利| 国产亚洲综合在线| 亚洲天天影视| 亚洲一区二区在线看| 欧美黑人多人双交| 另类成人小视频在线| 国产伦精品一区二区三| 亚洲视频大全| 亚洲综合99| 国产精品久线观看视频| avtt综合网| 欧美亚洲综合另类| 国产精品久久毛片a| 亚洲一区二区成人在线观看| 亚洲一区在线免费观看| 国产婷婷色一区二区三区在线| 亚洲女同精品视频| 久久麻豆一区二区| 亚洲成人直播| 欧美午夜激情视频| 久久国产66| 亚洲区中文字幕| 久久美女性网| 亚洲天堂av综合网| 国产在线精品一区二区夜色| 欧美一区永久视频免费观看| 欧美日一区二区三区在线观看国产免| 欧美激情一区二区三区蜜桃视频 | 国产亚洲欧美日韩在线一区| 久久不射2019中文字幕| 亚洲另类自拍| 久久久久久久综合日本| 亚洲三级网站| 国内精品久久久| 亚洲作爱视频| 欧美国产免费| 久久婷婷国产麻豆91天堂| 夜色激情一区二区| 激情欧美日韩一区| 国产精品区二区三区日本| 欧美激情视频一区二区三区不卡| 日韩视频在线播放| 亚洲人成人一区二区三区| 性色av一区二区三区| 一区二区三区四区精品| 亚洲国产精品成人一区二区 | 国产精品夜夜夜一区二区三区尤| 米奇777超碰欧美日韩亚洲| 久久久天天操| 久久精品噜噜噜成人av农村| 亚洲欧美综合v| 亚洲欧美成aⅴ人在线观看| 亚洲少妇在线| 性欧美超级视频| 久久国产天堂福利天堂| 久久精品国产免费看久久精品| 久久成人一区二区| 嫩草影视亚洲| 欧美亚洲成人免费| 国产亚洲精品自拍| 亚洲国产欧美另类丝袜| 一区二区福利| 久久午夜色播影院免费高清| 欧美成人免费在线| 一本色道久久综合亚洲精品不| 亚洲欧美日韩国产综合| 久久精品91久久久久久再现| 欧美aa在线视频| 国产综合色一区二区三区| 亚洲精品一二| 久久女同精品一区二区| 亚洲免费观看高清在线观看| 久久婷婷av| 亚洲一区精品视频| 日韩午夜精品| 久久一区二区视频| 亚洲永久视频| 国产精品videosex极品| 悠悠资源网久久精品| 午夜精品偷拍| 一区二区三区 在线观看视频| 久久精品盗摄| 国产一区二区在线免费观看| 亚洲在线观看视频网站| 亚洲美女电影在线| 欧美黄网免费在线观看| 亚洲日本黄色| 亚洲激情一区二区| 欧美精品免费观看二区| …久久精品99久久香蕉国产 | 国产一区二区三区自拍| 亚洲欧美国产高清va在线播| 亚洲人成人一区二区三区| 欧美激情网友自拍| 亚洲性感激情| 久久精品色图| 亚洲精品免费在线观看| 亚洲精品在线一区二区| 国产精品国产三级国产aⅴ无密码| 一区二区三区视频在线| 亚洲天堂av在线免费| 国产在线视频不卡二| 亚洲国产老妈| 国产一区二区三区电影在线观看| 久久人人爽国产| 国产精品日韩精品| 一区二区三区日韩精品| 在线综合亚洲| 影音先锋日韩资源| 99亚洲精品| 午夜视频精品| 亚洲精品久久久久久下一站| 亚洲一区二区三| 99国产精品久久久久久久| 亚洲免费在线观看| 亚洲素人一区二区| 麻豆成人在线播放| 久久亚洲春色中文字幕| 国产精品久久久久永久免费观看| 欧美成人一区二区| 国产一区二区三区无遮挡| 在线性视频日韩欧美| 99视频精品免费观看| 欧美~级网站不卡| 欧美电影在线观看完整版| 狠狠入ady亚洲精品经典电影| 亚洲最新色图| 午夜精品一区二区在线观看|