1. C++ 98/03標準的for回圈
在C++ 98/03標準中,如果要用 for 回圈陳述句遍歷一個陣列或者容器,只能套用如下結構:
for(運算式 1; 運算式 2; 運算式 3){
//回圈體
}
例如,下面程式演示了用上述結構遍歷陣列和容器的具體實作程序:
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
int main() {
char arc[] = "http://c.biancheng.net/cplus/11/";
int i;
//for回圈遍歷普通陣列
for (i = 0; i < strlen(arc); i++) {
cout << arc[i];
}
cout << endl;
vector<char>myvector(arc,arc+23);
vector<char>::iterator iter;
//for回圈遍歷 vector 容器
for (iter = myvector.begin(); iter != myvector.end(); ++iter) {
cout << *iter;
}
return 0;
}
程式執行結果為:
http://c.biancheng.net/cplus/11/
http://c.biancheng.net/
2. C++ 11標準的for回圈
在 C++ 11 標準中,除了可以沿用前面介紹的用法外,還為 for 回圈添加了一種全新的語法格式,如下所示:
for (declaration : expression){
//回圈體
}
引數說明:
- declaration:表示此處要定義一個變數,該變數的型別為要遍歷序列中存盤元素的型別,需要注意的是,C++ 11 標準中,declaration引數處定義的變數型別可以用 auto 關鍵字表示,該關鍵字可以使編譯器自行推導該變數的資料型別,
- expression:表示要遍歷的序列,常見的可以為事先定義好的普通陣列或者容器,還可以是用 {} 大括號初始化的序列,
可以看到,同 C++ 98/03 中 for 回圈的語法格式相比較,此格式并沒有明確限定 for 回圈的遍歷范圍,這是它們最大的區別,即舊格式的 for 回圈可以指定回圈的范圍,而 C++11 標準增加的 for 回圈,只會逐個遍歷 expression 引數處指定序列中的每個元素,
下面程式演示了如何用 C++ 11 標準中的 for 回圈遍歷上面程式定義的 arc 陣列和 myvector 容器:
#include <iostream>
#include <vector>
using namespace std;
int main() {
char arc[] = "http://c.biancheng.net/cplus/11/";
//for回圈遍歷普通陣列
for (char ch : arc) {
cout << ch;
}
cout << '!' << endl;
vector<char>myvector(arc, arc + 23);
//for回圈遍歷 vector 容器
for (auto ch : myvector) {
cout << ch;
}
cout << '!';
return 0;
}
程式執行結果為:
http://c.biancheng.net/cplus/11/ !
http://c.biancheng.net/!
這里有以下 2 點需要說明:
-
程式中在遍歷 myvector 容器時,定義了 auto 型別的 ch 變數,當編譯器編譯程式時,會通過 myvector 容器中存盤的元素型別自動推匯出 ch 為 char 型別,注意,這里的 ch 不是迭代器型別,而表示的是 myvector 容器中存盤的每個元素,
-
仔細觀察程式的輸出結果,其中第一行輸出的字串和 "!" 之間還輸出有一個空格,這是因為新格式的 for 回圈在遍歷字串序列時,不只是遍歷到最后一個字符,還會遍歷位于該字串末尾的 '\0'(字串的結束標志),之所以第二行輸出的字串和 "!" 之間沒有空格,是因為 myvector 容器中沒有存盤 '\0',
2.1 遍歷用{}大括號初始化的串列
新語法格式的 for 回圈還支持遍歷用{}大括號初始化的串列,比如:
#include <iostream>
using namespace std;
int main() {
for (int num : {1, 2, 3, 4, 5}) {
cout << num << " ";
}
return 0;
}
程式執行結果為:
1 2 3 4 5
2.2 declaration 引數處定義參考形式的變數
在使用新語法格式的 for 回圈遍歷某個序列時,如果需要遍歷的同時修改序列中元素的值,實作方案是在 declaration 引數處定義參考形式的變數,舉個例子:
#include <iostream>
#include <vector>
using namespace std;
int main() {
char arc[] = "abcde";
vector<char>myvector(arc, arc + 5);
//for回圈遍歷并修改容器中各個字符的值
for (auto &ch : myvector) {
ch++;
}
//for回圈遍歷輸出容器中各個字符
for (auto ch : myvector) {
cout << ch;
}
return 0;
}
程式執行結果為:
bcdef
此程式中先后使用了 2 個新語法格式的 for 回圈,其中前者用于修改 myvector 容器中各個元素的值,后者用于輸出修改后的 myvector 容器中的各個元素,
既然 declaration 引數既可以定義普通形式的變數,也可以定義參考形式的變數,應該如何選擇呢?其實很簡單,如果需要在遍歷序列的程序中修改器內部元素的值,就必須定義參考形式的變數;反之,建議定義const &(常參考)形式的變數(避免了底層復制變數的程序,效率更高),也可以定義普通變數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540919.html
標籤:其他
下一篇:day11-功能實作10
