1. C++ 98/03標準的for迴圈 在C++ 98/03標準中,如果要用 for 迴圈語句遍歷一個數組或者容器,只能套用如下結構: for(表達式 1; 表達式 2; 表達式 3){ //迴圈體 } 例如,下麵程式演示了用上述結構遍曆數組和容器的具體實現過程: #include <iostre ...
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 &
(常引用)形式的變數(避免了底層複製變數的過程,效率更高),也可以定義普通變數。