日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

范围for语句的整理

發布時間:2024/4/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 范围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語句處理多維數組的時候,除了最內層的循環外,其他所有循環的控制變量都應該是引用類型

#include<iostream> #include<cctype> #include<string> #include<vector> #include<iterator> #include"Sales_item.h" using namespace std; int main(void) {//練習3.43int ia[3][4] = { //三個元素,每個元素都是大小為4的數組{0,1,2,3}, //第1行的初始值{4,5,6,7}, //第2行的初始值{8,9,10,11} //第3行的初始值};//使用范圍for語句管理迭代過程for (auto &row : ia)for (int &col : row)cout << col << endl;cout << endl;//使用普通for語句,使用下標運算符for (size_t row = 0; row < 3; row++)for (size_t col = 0; col < 4; col++)cout << ia[row][col] << endl;cout << endl;//使用普通for語句,使用指針int(*p)[4] = ia; //p指向含有4個整數的數組for (; p != ia + 3; p++) for (int *q = *p; q != *p + 4; q++) //q指向含有4個整數數組的首元素,也就是說,q指向一個整數cout << *q << endl;cout << endl;//vector<int>::difference_type atp; //聲明difference_type的時候需要指定具體類型,和迭代器類似//difference_type是帶符號類型的//練習3.44using int_array = int[4]; //新標準下類型別名是聲明,參見2.5.1節P60//此時將類型是"4個整數的數組"命名成了int_arraytypedef int int_array[4]; //與上一語句等價的typedef聲明,參見2.5.1節P60//輸出ia中每個元素的值,每個內層數組各占一行for (int_array *p = ia; p != ia + 3; p++)for (int *q = *p; q != *p + 4; q++)cout << *q << endl;cout << endl;//練習3.45//使用范圍for語句管理迭代過程for (auto &row : ia)for (int &col : row)cout << col << endl;cout << endl;return 0; }

4.為什么不能通過范圍dor語句向vector(或者其他容器)中添加元素

范圍for語句的語法形式為

for(declaration:expression)statement

其中expression必須為一個序列,為什么呢?
范圍for語句的定于來源與等價的傳統for語句:比如下面這個讓vector中元素翻倍的循環,范圍for語句還是依賴于迭代器實現的。

vector<int>v = { 1,23,56 }; for (auto &r : v) //范圍forr *= 2; for (auto beg = v.begin(), end = v.end(); beg != end; ++beg){ //傳統forauto &r = *beg;r *= 2; }

這就是說,其實在范圍for語句中,預存了end()的值。一旦向序列中增加或者刪除元素,end函數有可能變得無效,循環就可能不是預期中的了。
因為這個時候對容器的增刪操作使得保存在end中的迭代器失效了,不再指向任何元素,或者是尾元素的后一個位置。

5.為什么需要對序列中的元素執行寫操作的時候,循環變量必須聲明成引用類型?

  • 當傳入的迭代參數類型為非引用時,做的是值傳遞,值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值,所以才修改無效。
  • 而在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量,所以修改有效。
  • 這里講解了幾種關于參數傳遞的區別http://xinklabi.iteye.com/blog/653643

總結

以上是生活随笔為你收集整理的范围for语句的整理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。