亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++11的for循環,以及范圍Range類的簡單實現

2020-05-23 14:02:35
字體:
來源:轉載
供稿:網友

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

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;}

可以遍歷的對象包括:

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

(對于動態生成的數組的遍歷,用下面介紹的Range類也能省不少代碼)

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

語句 for ( range_declaration : range_expression) loop_statement

與以下語句作用等價:

{  auto && __range = range_expression ;  for (auto __begin = begin_expr,    __end = end_expr;   __begin != __end; ++__begin) {  range_declaration = *__begin;  loop_statement } }

對于可遍歷的類對象,__begin和__end分別由類的begin()和end()方法產生。且由于__range變量是右值引用,如果range_expression的結果是右值,其將會在循環結束后析構。

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

這樣,C++11終于支持了這種現代編程語言都支持的遍歷方式了。但是,無論是語法還是標準庫都不支持對具體數字的遍歷,比如python中的 for i in xrange(1,5)語句中,x將連續取[1,4]中的值。(Boost庫有irange類可以滿足這個需求,但是下面會討論下我的實現)

最直接的方法,就是寫一個函數,返回一個vector<int>對象,其元素為從begin到end的值。但這樣每次循環時都得構造一個這樣的對象,略慢。

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

,而比較和自加操作均對這個數進行操作。

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

有想法之后,實現起來就很容易了。首先定義一個仿迭代器 FakeIter ,其對一個數值進行封裝,并重載必須的操作符。

class FakeIter{ typedef long _VType; //數值的類型為long。當然了,也可以寫個模板出來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_;};

至于“容器”類的實現,就更簡單了:實現begin()和end()方法,并返回上面的FakeIter就好了。類中的方法加了一些cout語句,可以更清楚的了解循環執行時具體方法的調用過程,實際用時可以刪掉。

 class Range{ typedef long _VType; //同樣,也可以弄個模板出來,但是就不方便用了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_;}; 

好了,試試看這貨有沒用:

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

嗯,如果把那些影響視線的輸出語句的注釋掉的話貌似能用了?,F在要遍歷一個new生成的數組的話,只需用這東西Range個下標,世界就清靜了。

但是,步長呢!好吧,貌似我暫時還沒這方面的需求。不過實現起來也很簡單:修改FakeIter類就可以了,可以增加一個表示步長的成員,然后再修改自加操作。更進一步,也可以加一個生成器方法,就能變成一個更通用的生成器了。配合C++11 lambda操作符,用起來也挺方便。

以上就是小編為大家帶來的C++11的for循環,以及范圍Range類的簡單實現全部內容了,希望大家多多支持VEVB武林網~

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区中文| 国产精品日韩欧美| 亚洲精品一区av在线播放| 日韩在线免费视频观看| 日本欧美国产在线| 国产欧美日韩丝袜精品一区| 久久不射热爱视频精品| 3344国产精品免费看| 按摩亚洲人久久| 国产综合福利在线| 久久久久久久网站| 久久这里有精品| 麻豆一区二区在线观看| 91视频免费在线| 亚洲精品一区中文字幕乱码| 亚洲综合大片69999| 精品国偷自产在线| 日韩在线中文字幕| 国产精品视频资源| 97视频在线观看网址| 欧美午夜视频一区二区| 欧美性videos高清精品| 亚洲精品久久久久久久久久久久久| 日韩美女在线观看一区| 黄色成人av在线| 成人欧美一区二区三区黑人| 亚洲人成电影在线| 日韩在线中文视频| 精品日本美女福利在线观看| 久久久久久亚洲精品不卡| 亚洲精品成人久久久| 亚洲人成绝费网站色www| 日韩成人中文字幕在线观看| 亚洲精品自拍第一页| 91精品国产91久久久| 欧美日韩国产黄| 777777777亚洲妇女| 韩国欧美亚洲国产| 欧美大奶子在线| 97精品一区二区视频在线观看| 亚洲肉体裸体xxxx137| 一区二区三区四区视频| 国产热re99久久6国产精品| 久久久精品国产网站| 大量国产精品视频| 国内精品久久久久久久| 久久九九有精品国产23| 久久成人综合视频| 日韩中文字幕网站| 日韩精品黄色网| 国产精品视频免费在线观看| 韩国一区二区电影| 亚洲精品av在线播放| 亚洲一区二区三区毛片| 国产一区二区黄| 亚洲精品一区在线观看香蕉| 亚洲аv电影天堂网| 中文字幕一精品亚洲无线一区| 国内精品中文字幕| 欧美最猛黑人xxxx黑人猛叫黄| 中文字幕亚洲一区在线观看| 国产91亚洲精品| 欧美另类交人妖| 色琪琪综合男人的天堂aⅴ视频| 国产成人avxxxxx在线看| 欧美性猛交xxxx乱大交极品| 国产综合在线看| 日本视频久久久| 久久精品国产一区| 中文字幕av一区| 精品久久久一区| 欧美中文在线观看国产| 欧美成人性色生活仑片| 亚洲天堂2020| 欧美高清不卡在线| 茄子视频成人在线| 91精品久久久久| 国产精品视频永久免费播放| 国产精品老牛影院在线观看| 国产精品视频网站| 日韩有码在线观看| 亚洲色图17p| 国产成人精品视频在线观看| 中文字幕亚洲无线码a| 久久久国产一区| 日韩最新av在线| 亚洲成人av资源网| 久久av红桃一区二区小说| 一本一本久久a久久精品综合小说| 97av在线影院| 国产成人精品在线视频| 欧美精品免费播放| 视频在线观看99| 日韩中文字在线| 欧美日韩亚洲精品内裤| 亚洲欧洲激情在线| 欧美在线视频导航| 欧美激情a∨在线视频播放| 国产黑人绿帽在线第一区| 少妇高潮 亚洲精品| 91精品国产91久久久久久久久| 91日韩在线视频| 国产成人精品久久二区二区91| 亚洲色图欧美制服丝袜另类第一页| 欧美做受高潮电影o| 91av在线不卡| 亚洲最大的成人网| 精品少妇一区二区30p| 午夜精品一区二区三区在线视频| 亚洲视频在线看| 91啪国产在线| 欧美在线xxx| 97在线视频一区| 久久天天躁夜夜躁狠狠躁2022| 日韩中文字幕在线观看| 日韩欧美中文在线| 欧美激情在线观看| 九九热精品视频在线播放| 国产性猛交xxxx免费看久久| 久久久久久久一区二区| 欧美日韩日本国产| 色婷婷久久一区二区| 精品成人国产在线观看男人呻吟| 成人网中文字幕| 亚洲永久在线观看| 国产精国产精品| 久久久久久久一| 亚洲天堂av女优| 亚洲国产精品一区二区三区| 69av视频在线播放| 久久久91精品国产| 久久精品在线播放| 久久综合伊人77777尤物| 欧美日韩国产精品一区二区不卡中文| 国产精品白丝av嫩草影院| 岛国av一区二区三区| 欧美重口另类videos人妖| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲免费电影在线观看| 日韩欧美在线中文字幕| 久久精品国产69国产精品亚洲| 成人自拍性视频| 久久天天躁狠狠躁夜夜躁2014| 成人黄色在线观看| 成人精品一区二区三区| 久久不射热爱视频精品| 欧美在线视频网站| 91成人国产在线观看| 国产欧美精品久久久| 国产一区二区三区三区在线观看| 欧美乱大交xxxxx另类电影| 国模私拍一区二区三区| 亚洲视频在线看| 欧美激情欧美激情在线五月| 日韩有码片在线观看| 国产成人精品久久二区二区91| 亚洲精品网站在线播放gif| 欧美午夜精品伦理| 亚洲毛片一区二区| 成人有码视频在线播放| 亚洲欧美激情在线视频| 欧美成人午夜激情视频| 91在线直播亚洲| 国产99在线|中文|