锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 鍐呭鏉ユ簮錛歍CPL鍜孴CPL棰樿В
鍦═CPL涓殑19.1涔犻錛屾湁瀵箁everse綆楁硶鐨勮璁°?br />template<typename Bi> void reverse(Bi begin, Bi end)
浠嶴TL鐨勫畾涔夋潵鐪嬶紝鍙傛暟杈撳叆鐨勮凱浠e櫒鏄弻鍚戣凱浠e櫒(Bidirectional iterator)銆傝璁¤搗鏉ヤ篃鏄瘮杈冨鏄撶殑銆?br />namespace{
聽template<typename Bi>
聽inline void reverse(Bi begin, Bi end){
聽聽while(begin != end)
聽聽聽iter_swap(begin++, --end);
聽}
}
鑰屽湪TCPL鐨勯瑙i噷闈㈡彁鍒頒簡杈撳叆鍙傛暟鏄悜鍓嶈凱浠e櫒鐨勬儏鍐碉紙Forward iterator錛夈傝繖鏍穜everse綆楁硶寰楅噸鏂拌璁°?br />綆楁硶姒傝堪錛?br />聽聽聽 1.鍙嶈漿涓涓悜鍓嶅簭鍒楋紝鍙互棣栧厛灝嗗簭鍒楀垎鎴愬ぇ鑷翠竴鏍烽暱鐨勪袱鍗娿傜劧鍚庣敤std::swap_ranges綆楁硶浜ゆ崲鐫涓や釜鍗婇暱搴忓垪銆?br />聽聽聽 2.閫掑綊鍦板弽杞繖涓袱涓崐闀垮簭鍒椼?br />[娉ㄦ剰涓涓嬪簭鍒楀厓绱犵殑涓暟錛堝鍋舵暟錛塢
template<typename For>
void forward_reverse(For begin1, int len)
{
聽if(len > 1){
聽聽int half_len = len / 2;
聽聽For end1 = begin1;
聽聽advance(end1, hal_len);
聽聽For begin2 = end1;
聽聽if(len % 2 != 0) //搴忓垪涓暟涓哄鏁?br />聽聽聽++begin2;
聽聽std::swap_ranges(begin1, end1, begin2);
聽聽forward_reverse(begin1, half_len);
聽聽forward_reverse(begin2, half_len);
聽}
}
鍐嶄負forward_reverse鍑芥暟鍜宺everse錛坆idirection錛夊嚱鏁版彁渚涗竴涓粺涓鐨勫熷彛銆?br />template<typename It>
inline void flex_reverse(It begin, It end)
{
聽using std::iterator_traits;
聽tagged_reverse(begin, end, iterator_traits<It>::iterator_category());
}
tagged_reverse()鍑芥暟鏄氳繃鍑芥暟閲嶈澆鍜岃凱浠e櫒鐗瑰緛綾伙紙钀冨彇鎶鏈級鐨勭粨鍚堟潵瀹屾垚涓嬮潰涓や釜鍑芥暟鐨勮嚜鍔ㄩ夋嫨銆?/font>
template<typename For>聽 //forward_reverse灝佽
inline void tagged_reverse(For begin, For end, std::forward_iterator_tag)
{
聽forward_reverse(begin, distance(begin, end));
}
template<typename For>聽 //reverse灝佽
inline void tagged_reverse(For begin, For end, std::bidirectional_iterator_tag)
{
聽reverse(begin, end);
}
鍚庢潵鎴戝彂鐜板ソ鍍忔妸Forward_iterator鐨勫鍣ㄥ茍涓嶅瑙併?br />STL瀹瑰櫒錛?銆佸弻鍚戣凱浠e櫒錛圔idirectional iterator錛?br />聽聽聽聽聽聽聽聽聽聽聽 list銆乻et銆乵ultiset銆乵ap銆乵ultimap
聽聽聽聽聽聽聽 2銆侀殢鏈哄瓨鍙栬凱浠e櫒錛圧andom access iterator錛?br />聽聽聽聽聽聽聽聽聽聽聽 vector銆乨eque銆乻tring
闄勶細iterator_traits妯℃澘綾諱腑鐨勪竴緇勫0鏄庢弿榪幫細
template<class Iter> struct iterator_traits
{
聽typedef typename Iter::iterator_category iterator_category;
聽typedef typename Iter::value_type value_type;
聽typedef typename Iter::difference_type difference_type;
聽typedef typename Iter::pointer pointer;
聽typedef typename Iter::reference reference;
};
聽
鏈夋椂鍊欙紝鎴戜滑浼氱姱榪欐牱鐨勯敊璇紝鎶婁袱涓笉鍚屽簭鍒楃殑榪唬鍣ㄥ幓鏋勬垚涓涓簭鍒椾簡銆傛瘮濡傦細
榪欓噷Bjarne Stroustrup緇欏嚭涓涓В鍐抽棶棰樼殑閫斿緞銆傚叾鍏抽敭灝辨槸鐢ㄦ暣涓鍣ㄤ唬鏇縳.begin, x.end()鐨勮緭鍏ャ?br />榪欐牱錛屾垜浠灝佽涓や釜涓滆タ錛?銆乫ind()鍑芥暟銆?2銆乥egin(),end()
鍒╃敤閲嶈澆錛屽皝瑁協ind鍑芥暟銆?br />
聽
鍒╃敤瀵瑰伓錛屽皝瑁呰凱浠e櫒銆?br />棣栧厛錛屾垜浠瀯閫犱竴涓狪seq浠ヤ繚璇佽凱浠e櫒鏄粺涓搴忓垪鎴愬杈撳叆鐨勩?/p>
聽
鎺ョ潃鏋勯犱竴涓崗鍔╁嚱鏁幫紝鐩存帴浼犻掑鍣ㄣ?/p>
榪欐牱錛屾垜浠彲浠ュ埄鐢ㄤ笂闈㈢殑鏈哄埗錛屾潵閬垮厤鎵鎻愬嚭鐨勯敊璇?/p>
聽
涓嬮潰鎴戜滑浠旂粏鍒嗘瀽鏁翠釜鏈哄埗鐨勫嚑涓粏鑺傘?br />鍏堣鎴戜滑鏉ョ湅鐪媝air鐨勬牱瀛愩?/p>
娉ㄦ剰pair鐨勪袱涓暟鎹垚鍛榝irst, second閮芥槸public鐨勶紝鎵浠seq緇ф壙pair涔嬪悗鍙互鐩存帴璁塊棶銆?/p>
鑰冨療find()鍑芥暟鐨勯噸杞界増鏈?br />find(Iseq<In> r, const T& v)
娉ㄦ剰鈥淚seq<In> r鈥濅嬌鐢ㄥ間紶閫掞紝鑰屼笉鐢ㄥ紩鐢ㄤ紶閫掞紙Iseq<In>& r錛夈?br />榪欐槸鍥犱負iiseq鍗忓姪鍑芥暟榪斿洖涓涓復鏃跺璞★紝鎵浠ュ湪find涓紝涓嶈兘鐢ㄥ紩鐢ㄤ紶閫掋?br />template<class C>Iseq<typename C::iterator> iiseq(C& c) //C涓哄鍣?br />{
聽return Iseq<typename C::iterator>(c.begin(), c.end());
}
澶у鍙兘浼氳冭檻鍒版晥鐜囬棶棰橈紝瑙夊緱鍊間紶閫掑彲鑳戒笉濡ャ傚叾瀹炰笉鐒訛紝鎴戜滑鍙互鍙戠幇錛孖seq閲岄潰鐨勬暟鎹垚鍛樻槸涓や釜Iterator錛屼竴鑸潵璇翠笉鏄緢澶э紙鏈夋椂錛屽氨鏄袱涓寚閽堬級錛屽湪鏁堢巼涓婁笉浼氫駭鐢熷緢澶х殑褰卞搷銆?/p>
榪樻湁榪欓噷浠g爜涓嚭鐜皌ypename,(濡俽eturn Iseq<typename C::iterator>(c.begin(), c.end());) 鍙兘瀵瑰垵瀛﹁呮潵璇存湁浜涚敓鐤忋備負浠涔堜笉鐩存帴鍐欙細 Iseq<C::iterator>(c.begin(), c.end())銆傝繖鏄敱浜庣紪璇戝櫒涓嶈兘鐩存帴璁ゅ嚭C::iterator鏄竴縐嶇被鍨嬶紝鎵浠ユ垜浠姞涓婁慨楗扮鍙穞ypename鍛婅瘔緙栬瘧鍣–::iterator浣跨敤涓縐嶇被鍨嬨?/p>
聽