第9章:statements
相比于c++98的老標準,c++11新標準增加了范圍for語句(range for statement)。
范圍for語句的語法形式為:
expression表示的必須是一個序列,比如用花括號括起來的初始值列表,數組,或者vector和string等類型的對象。這些類型共有的一個特點是擁有能返回迭代器的begin()和end()成員。
declaration定義一個變量,序列中的每個元素都得轉換成該變量的類型。確保類型相容的最簡單辦法是使用auto類型說明符,這個關鍵字可以令編譯器幫助我們找到指定合適的類型。如果對元素執行寫操作,必須要定義成引用,當然如果對于一個類型來說,元素的復制太昂貴的話,也要定義成引用,以節省運行時間。
每次迭代都會重新定義循環控制變量,并將其初始化為序列中的一個值,之后才會執行statement,所有元素處理完畢后循環終止。
以下面的代碼為例,其目的是輸出一個vector類型元素的值
vector<int> v1={1,2,3,4,5,6,7,8,9}; for(auto x:v1)cout<<x<<" "; cout<<endl;在這個例子中,v1是一個序列,因為vector有begin()和end()成員,auto x 代表declaration,定義了一個變量,每次執行時都會用v1中的元素來給變量x賦值。當v1中所有元素都輸出完之后循環終止,再執行語句cout<<endl。其實上述的代碼等價成如下代碼:
vector<int> v1={1,2,3,4,5,6,7,8,9}; for(auto beg=v1.begin(),end=v1.end();beg!=end;++beg) {auto x=*beg;cout<<x<<" "; } cout<<endl;從上面的等價代碼中我們可以得出另外一個結論:不能通過范圍for循環語句給容器增減元素,因為在范圍for循環語句中預存了該序列end()的值,一旦我們給容器增減元素,就可能會導致該序列中end()函數的值發生改變,這就導致范圍for循環語句中之前預存的end()函數的值就失效了。
如果我們想要改變序列中元素的值,我們要給變量定義成引用,如下面的代碼例子所示:
vector<int> v1={1,2,3,4,5,6,7,8,9}; for(auto& x:v1)x*=2;當然如果我們不想改變一個序列中元素的值,但元素的復制太昂貴,這樣我們也可以定義成引用,如下面代碼例子所示:
//假設vector<string> v1中存儲的字符串很長 for(const auto&x: v1)cout<<x<<" "; cout<<endl;總結
以上是生活随笔為你收集整理的第9章:statements的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery输入框回车添加标签特效
- 下一篇: “巴青虫草,雅魅天下 ”巴青县第三届冬虫