亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++11的for循環(huán),以及范圍Range類的簡(jiǎn)單實(shí)現(xiàn)

 更新時(shí)間:2016年06月24日 09:59:08   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇C++11的for循環(huán),以及范圍Range類的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的, 現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

C++11支持range-based for循環(huán)。這是一個(gè)很方便的特性,能省挺多代碼。以下代碼就能很方便的遍歷vector中的元素,并打印出來(lái):

std::vector<int> int_vec;

int_vec.push_back(1);

int_vec.push_back(2);

//如果要修改int_vec中的元素,將變量x聲明為 int& 即可

for (int x: int_vec)

{

 std::cout << x << endl;

}

可以遍歷的對(duì)象包括:

•數(shù)組。(不包括指針)
•定義了begin()和end()方法,且返回該方法返回迭代器的類對(duì)象。(STL 中所有容器都可以)

(對(duì)于動(dòng)態(tài)生成的數(shù)組的遍歷,用下面介紹的Range類也能省不少代碼)

參考 http://en.cppreference.com/w/cpp/language/range-for 可知,

語(yǔ)句 for ( range_declaration : range_expression) loop_statement

與以下語(yǔ)句作用等價(jià):

{ 

 auto && __range = range_expression ; 

 for (auto __begin = begin_expr, 

   __end = end_expr;

   __begin != __end; ++__begin) {

  range_declaration = *__begin; 

 loop_statement

 } 

}

對(duì)于可遍歷的類對(duì)象,__begin和__end分別由類的begin()和end()方法產(chǎn)生。且由于__range變量是右值引用,如果range_expression的結(jié)果是右值,其將會(huì)在循環(huán)結(jié)束后析構(gòu)。

--------------------------------------------------------------------------------

這樣,C++11終于支持了這種現(xiàn)代編程語(yǔ)言都支持的遍歷方式了。但是,無(wú)論是語(yǔ)法還是標(biāo)準(zhǔn)庫(kù)都不支持對(duì)具體數(shù)字的遍歷,比如python中的 for i in xrange(1,5)語(yǔ)句中,x將連續(xù)取[1,4]中的值。(Boost庫(kù)有irange類可以滿足這個(gè)需求,但是下面會(huì)討論下我的實(shí)現(xiàn))

最直接的方法,就是寫一個(gè)函數(shù),返回一個(gè)vector<int>對(duì)象,其元素為從begin到end的值。但這樣每次循環(huán)時(shí)都得構(gòu)造一個(gè)這樣的對(duì)象,略慢。

從標(biāo)準(zhǔn)來(lái)看,如果一個(gè)類要支持這樣遍歷,至少得有begin()和end()方法。在for循環(huán)的初始化部分,調(diào)用了這兩個(gè)方法之后,就沒(méi)這個(gè)類啥事了——都是迭代器的事。所以很自然,從迭代器上下手。這個(gè)迭代器必須支持三種操作:!=,前綴++,解引用
。有沒(méi)發(fā)現(xiàn),如果這個(gè)“迭代器”是個(gè)int數(shù)值的話,上面循環(huán)中的__begin!=__end;++__begin語(yǔ)句就是一個(gè)非常自然的實(shí)現(xiàn)?,F(xiàn)在的目標(biāo)很簡(jiǎn)單了:這個(gè)“迭代器”不遍歷容器中的每個(gè)元素,而就是一個(gè)簡(jiǎn)單的int數(shù)值的封裝。對(duì)其解引用將返回這個(gè)數(shù)

,而比較和自加操作均對(duì)這個(gè)數(shù)進(jìn)行操作。

--------------------------------------------------------------------------------

有想法之后,實(shí)現(xiàn)起來(lái)就很容易了。首先定義一個(gè)仿迭代器 FakeIter ,其對(duì)一個(gè)數(shù)值進(jìn)行封裝,并重載必須的操作符。

class FakeIter

{

 typedef long _VType; //數(shù)值的類型為long。當(dāng)然了,也可以寫個(gè)模板出來(lái)

public:

 

 explicit FakeIter(_VType val)

  :value_(val){}

 

 bool operator != (const FakeIter& other) const

 {

  return (this->GetValue()) != (other.GetValue());

 }

 _VType operator* () const

 {

  return GetValue();

 }

 const FakeIter& operator++ ()

 {

  ++value_;

  return *this;

 }

private:

 _VType GetValue() const

 {

  return value_;

 }

 _VType value_;

};

至于“容器”類的實(shí)現(xiàn),就更簡(jiǎn)單了:實(shí)現(xiàn)begin()和end()方法,并返回上面的FakeIter就好了。類中的方法加了一些cout語(yǔ)句,可以更清楚的了解循環(huán)執(zhí)行時(shí)具體方法的調(diào)用過(guò)程,實(shí)際用時(shí)可以刪掉。

 
class Range

{

 typedef long _VType; //同樣,也可以弄個(gè)模板出來(lái),但是就不方便用了

public:

 Range (_VType begin_v, _VType end_v)

  :begin_value_(begin_v), end_value_(end_v)

 {

  cout<<"Range::Range()"<<endl;

 }

 ~Range()

 {

  cout<<"Range::~Range()"<<endl;

 }

 

 FakeIter begin () const

 {

  cout<<"Range::begin()"<<endl;

  return FakeIter(begin_value_);

 }

 FakeIter end () const

 {

  cout<<"Range::end()"<<endl;

  return FakeIter(end_value_ );

 }

private:

 _VType begin_value_;

 _VType end_value_;

}; 

好了,試試看這貨有沒(méi)用:

for (auto x: Range(1,5))

{

 std::cout<<x<<endl;

}

std::cout<<"Loop end"<<endl;

在vs2012及clang下輸出如下:

Range::Range() 
Range::begin() 
Range::end() 
1 
2 
3 
4 
Range::~Range() 
Loop end

嗯,如果把那些影響視線的輸出語(yǔ)句的注釋掉的話貌似能用了?,F(xiàn)在要遍歷一個(gè)new生成的數(shù)組的話,只需用這東西Range個(gè)下標(biāo),世界就清靜了。

但是,步長(zhǎng)呢!好吧,貌似我暫時(shí)還沒(méi)這方面的需求。不過(guò)實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單:修改FakeIter類就可以了,可以增加一個(gè)表示步長(zhǎng)的成員,然后再修改自加操作。更進(jìn)一步,也可以加一個(gè)生成器方法,就能變成一個(gè)更通用的生成器了。配合C++11 lambda操作符,用起來(lái)也挺方便。

以上就是小編為大家?guī)?lái)的C++11的for循環(huán),以及范圍Range類的簡(jiǎn)單實(shí)現(xiàn)全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • 增加Vscode引用路徑的解決方法(2種)

    增加Vscode引用路徑的解決方法(2種)

    在嵌入式開發(fā)中需要經(jīng)常用到庫(kù)函數(shù), Vscode需要配置引用路徑,本文主要介紹了增加Vscode引用路徑的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • c++實(shí)現(xiàn)圖像像素計(jì)算的示例詳解

    c++實(shí)現(xiàn)圖像像素計(jì)算的示例詳解

    我們知道每張圖像都能夠用矩陣來(lái)表示,矩陣中每個(gè)元素的值表示了圖像中每個(gè)像素值,像素值的大小就對(duì)應(yīng)著圖像的亮暗,本文主要來(lái)和大家介紹一下C++進(jìn)行圖像像素計(jì)算的相關(guān)知識(shí),感興趣的可以了解下
    2023-12-12
  • 如何求連續(xù)幾個(gè)數(shù)之和的最大值

    如何求連續(xù)幾個(gè)數(shù)之和的最大值

    本篇文章是對(duì)如何求連續(xù)幾個(gè)數(shù)之和的最大值進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++默認(rèn)參數(shù)與函數(shù)重載及注意事項(xiàng)

    C++默認(rèn)參數(shù)與函數(shù)重載及注意事項(xiàng)

    這篇文章主要介紹了C++默認(rèn)參數(shù)與函數(shù)重載及注意事項(xiàng)包括語(yǔ)法與使用,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2020-03-03
  • C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例

    C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例

    今天小編就為大家分享一篇關(guān)于C++實(shí)現(xiàn)十六進(jìn)制字符串轉(zhuǎn)換成int整形值的示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C語(yǔ)言 pthread_create() 函數(shù)講解

    C語(yǔ)言 pthread_create() 函數(shù)講解

    這篇文章主要介紹了C語(yǔ)言 pthread_create() 函數(shù)講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言隊(duì)列和應(yīng)用詳情

    C語(yǔ)言隊(duì)列和應(yīng)用詳情

    這篇文章主要介紹了C語(yǔ)言隊(duì)列和應(yīng)用詳情,文章將讓大家掌握掌握隊(duì)列的原理和作用、掌握隊(duì)列的寫法、掌握隊(duì)列在產(chǎn)品中的應(yīng)用,需要的朋友可以參考一下
    2022-03-03
  • 基于select、poll、epoll的區(qū)別詳解

    基于select、poll、epoll的區(qū)別詳解

    本篇文章是對(duì)select、poll、epoll之間的區(qū)別進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下
    2013-05-05
  • 利用C++求絕對(duì)值的幾種方法例子

    利用C++求絕對(duì)值的幾種方法例子

    相信大家在學(xué)習(xí)C++時(shí),應(yīng)該都有做過(guò)求絕對(duì)值的題目,下面這篇文章主要給大家介紹了關(guān)于利用C++求絕對(duì)值的幾種方法例子,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • C語(yǔ)言中基礎(chǔ)小問(wèn)題詳細(xì)介紹

    C語(yǔ)言中基礎(chǔ)小問(wèn)題詳細(xì)介紹

    這篇文章詳細(xì)介紹了C語(yǔ)言中基礎(chǔ)小問(wèn)題,有需要的朋友可以參考一下
    2013-10-10

最新評(píng)論