范围for语句的整理
范圍for語句的整理
2018-03-11 20:45:32?Enterprise_?閱讀數 549更多
分類專欄:?C++基礎
版權聲明:本文為博主原創文章,遵循?CC 4.0 BY-SA?版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/Enterprise_/article/details/79519432
1.如何處理stirng中的每個字符?(來自C++Primer中文版5th中P83)
使用基于范圍的for語句,比如下面的例子,輸出每個字符
#include<iostream> #include<string> using namespace std; int main(void) {string s("Hello world!!!");for (auto c : s)cout<<c<<endl;return 0; }2.修改序列中的元素,必須將循環變量申明為引用類型(來自C++Primer中文版5th中P83)
下面將整個string字符改寫成大寫,然后輸出。
#include<iostream> #include<string> #include<cctype> using namespace std; int main(void) {string s("Hello world!!!");for (auto &c : s)c=toupper(c);cout<<s<<endl;return 0; }3.處理多維數組(來自C++Primer中文版5th中P116的練習題目)
于編譯器初始化時會將這些數組形式的元素轉換成指向該數組內首元素的指針,這樣得到的row類型就是int*,這樣原來的for語句就是在一個int*中遍歷,這是不合法的。而如果改成引用類型,就不會發生上述轉換。
所以使用范圍for語句處理多維數組的時候,除了最內層的循環外,其他所有循環的控制變量都應該是引用類型
4.為什么不能通過范圍dor語句向vector(或者其他容器)中添加元素
范圍for語句的語法形式為
for(declaration:expression)statement其中expression必須為一個序列,為什么呢?
范圍for語句的定于來源與等價的傳統for語句:比如下面這個讓vector中元素翻倍的循環,范圍for語句還是依賴于迭代器實現的。
這就是說,其實在范圍for語句中,預存了end()的值。一旦向序列中增加或者刪除元素,end函數有可能變得無效,循環就可能不是預期中的了。
因為這個時候對容器的增刪操作使得保存在end中的迭代器失效了,不再指向任何元素,或者是尾元素的后一個位置。
5.為什么需要對序列中的元素執行寫操作的時候,循環變量必須聲明成引用類型?
- 當傳入的迭代參數類型為非引用時,做的是值傳遞,值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值,所以才修改無效。
- 而在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量,所以修改有效。
- 這里講解了幾種關于參數傳遞的區別http://xinklabi.iteye.com/blog/653643
總結
以上是生活随笔為你收集整理的范围for语句的整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重载和const形参
- 下一篇: java也可以做黑客?