C++11基于范圍for循環(huán)之高效遍歷新方式
一、傳統(tǒng)遍歷方式的局限性
在C++98中,遍歷數(shù)組通常采用以下方式:
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 將數(shù)組元素值全部乘以2
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
arr[i] *= 2;
}
// 打印數(shù)組中的所有元素
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
cout << arr[i] << " ";
}
cout << endl;這種傳統(tǒng)方式存在幾個(gè)問題:
需要手動(dòng)計(jì)算數(shù)組長度
循環(huán)控制變量(i)需要顯式聲明和管理
容易產(chǎn)生越界錯(cuò)誤
代碼冗長,意圖不夠直觀
二、基于范圍的for循環(huán)語法
基于范圍的for循環(huán)(range-based for loop)是C++11引入的一種簡化循環(huán)語法,它提供了一種更簡潔的方式來遍歷容器或數(shù)組中的所有元素。
基本語法
for (declaration : range_expression) {
// 循環(huán)體
}其中:
declaration(聲明部分):定義一個(gè)變量,每次迭代時(shí)它會(huì)被初始化為當(dāng)前元素的值,通常使用auto自動(dòng)推導(dǎo)類型
range_expression(范圍部分):表示要遍歷的序列(如數(shù)組、容器等)
for (聲明 : 范圍) 是基本語法結(jié)構(gòu)
可以使用continue結(jié)束本次循環(huán),或break跳出整個(gè)循環(huán)?
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 將數(shù)組元素值全部乘以2
for (auto& e : arr) {
e *= 2;
}
// 打印數(shù)組中的所有元素
for (auto e : arr) {
cout << e << " ";
}
cout << endl;三、使用示例
1、遍歷數(shù)組
int arr[] = {1, 2, 3, 4, 5};
for (int num : arr) {
cout << num << " ";
}
// 輸出: 1 2 3 4 52、遍歷標(biāo)準(zhǔn)容器
std::vector<std::string> words = {"Hello", "World", "C++"};
for (const auto& word : words) {
cout << word << " ";
}
// 輸出: Hello World C++3、使用auto自動(dòng)推導(dǎo)類型
std::list<double> values = {1.1, 2.2, 3.3};
for (auto value : values) {
cout << value << " ";
}
// 輸出: 1.1 2.2 3.34、修改容器元素
std::vector<int> nums = {1, 2, 3};
for (auto& num : nums) {
num *= 2; // 修改元素
}
// nums現(xiàn)在是 {2, 4, 6}四、使用條件
1、迭代范圍必須明確
對(duì)于數(shù)組:編譯器能確定首元素和末元素的位置
對(duì)于類:需要提供
begin()和end()方法,定義迭代范圍
2、迭代對(duì)象需要支持迭代器操作
迭代器需要實(shí)現(xiàn)++(前進(jìn))和==(比較)操作
實(shí)際上,任何提供了begin()和end()方法并返回迭代器的類型都可以使用范圍for
五、底層實(shí)現(xiàn)原理
范圍for循環(huán)的底層實(shí)現(xiàn)基于迭代器:
對(duì)于數(shù)組:轉(zhuǎn)換為傳統(tǒng)的指針遍歷
對(duì)于容器:轉(zhuǎn)換為使用該容器的迭代器進(jìn)行遍歷
可以通過查看匯編代碼驗(yàn)證這一實(shí)現(xiàn)方式
工作原理
基于范圍的for循環(huán)在底層會(huì)被編譯器轉(zhuǎn)換為傳統(tǒng)的迭代器循環(huán)。例如:
for (auto& item : container) {
// ...
}大致等價(jià)于:
{
auto&& __range = container;
auto __begin = begin(__range);
auto __end = end(__range);
for (; __begin != __end; ++__begin) {
auto& item = *__begin;
// ...
}
}六、注意事項(xiàng)
1、引用與拷貝:
使用auto item會(huì)創(chuàng)建元素的拷貝
使用auto& item會(huì)創(chuàng)建元素的引用(可修改原元素)
使用const auto& item會(huì)創(chuàng)建常量引用(不可修改原元素)
2、臨時(shí)范圍表達(dá)式:
for (auto x : getTemporaryVector()) { /* ... */ } // 臨時(shí)對(duì)象會(huì)延長生命周期3、不支持的情況:
不能用于指針數(shù)組(除非知道數(shù)組大小)
不能用于動(dòng)態(tài)分配的數(shù)組
不能用于不提供begin()/end()成員或自由函數(shù)的類型
4、性能考慮:
對(duì)于簡單類型,使用auto或auto&性能差異不大
對(duì)于復(fù)雜類型,避免不必要的拷貝
5、重點(diǎn):
當(dāng)需要修改元素時(shí),迭代變量應(yīng)聲明為引用類型(使用&)
對(duì)于不需要修改的只讀訪問,使用非引用形式更高效
范圍for循環(huán)不支持直接獲取當(dāng)前元素的索引位置
在循環(huán)過程中不應(yīng)修改容器的大小(如添加/刪除元素)
基于范圍的for循環(huán)大大簡化了集合遍歷的代碼,提高了可讀性和安全性,是現(xiàn)代C++編程中推薦使用的遍歷方式。
七、自定義類型支持
要讓自定義類型支持基于范圍的for循環(huán),需要提供begin()和end()成員函數(shù)或自由函數(shù):
class MyContainer {
int data[5] = {1, 2, 3, 4, 5};
public:
int* begin() { return data; }
int* end() { return data + 5; }
// 也可以提供const版本
};
MyContainer c;
for (int x : c) {
cout << x << " ";
}總結(jié)
到此這篇關(guān)于C++11基于范圍for循環(huán)之高效遍歷新方式的文章就介紹到這了,更多相關(guān)C++11范圍for循環(huán)遍歷方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++超詳細(xì)講解隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式
為了避免因?yàn)閷㈩悗熘械乃接谐蓡T開放給類的使用方而導(dǎo)致的軟件邏輯外泄,因此需要將對(duì)外代碼中的私有成員隱藏起來,下面我們來了解一下隱藏私有屬性和方法的兩種實(shí)現(xiàn)方式2022-05-05
C++函數(shù)參數(shù)匹配規(guī)則示例小結(jié)
這篇文章主要介紹了C++函數(shù)參數(shù)匹配規(guī)則,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
VisualStudio2022提交git代碼的方法實(shí)現(xiàn)
本文主要介紹了VisualStudio2022提交git代碼的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序
這篇文章主要為大家詳細(xì)介紹了基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
C++11范圍for初始化列表auto decltype詳解
C++11引入auto類型推導(dǎo)、decltype類型推斷、統(tǒng)一列表初始化、范圍for循環(huán)及智能指針,提升代碼簡潔性、類型安全與資源管理效率2025-07-07
C語言 ffmpeg與sdl實(shí)現(xiàn)播放視頻同時(shí)同步時(shí)鐘詳解
使用ffmpeg和sdl實(shí)現(xiàn)播放視頻后,需要再實(shí)現(xiàn)時(shí)鐘同步才能正常的播放視頻,尤其是有音頻的情況,我們通常需要將視頻同步到音頻來確保音畫同步2022-09-09

