最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11基于范圍for循環(huán)之高效遍歷新方式

 更新時(shí)間:2025年08月12日 09:04:17   作者:咸魚_要_翻身  
在C++編程中,循環(huán)是一種常用的結(jié)構(gòu),用于重復(fù)執(zhí)行某段代碼,這篇文章主要介紹了C++11基于范圍for循環(huán)之高效遍歷新方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、傳統(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è)問題:

  1. 需要手動(dòng)計(jì)算數(shù)組長度

  2. 循環(huán)控制變量(i)需要顯式聲明和管理

  3. 容易產(chǎn)生越界錯(cuò)誤

  4. 代碼冗長,意圖不夠直觀

二、基于范圍的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 5

2、遍歷標(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.3

4、修改容器元素

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):

  1. 當(dāng)需要修改元素時(shí),迭代變量應(yīng)聲明為引用類型(使用&)

  2. 對(duì)于不需要修改的只讀訪問,使用非引用形式更高效

  3. 范圍for循環(huán)不支持直接獲取當(dāng)前元素的索引位置

  4. 在循環(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++取余符號(hào)%的實(shí)現(xiàn)示例

    C++取余符號(hào)%的實(shí)現(xiàn)示例

    本文主要介紹了C++取余符號(hào)%的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • 淺談C語言中的 #define 宏定義

    淺談C語言中的 #define 宏定義

    C語言中的#define預(yù)處理指令用于文本替換,分為無參宏和帶參宏兩種形式,下面就來詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2026-01-01
  • C++超詳細(xì)講解隱藏私有屬性和方法的兩種實(shí)現(xià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ī)則示例小結(jié)

    這篇文章主要介紹了C++函數(shù)參數(shù)匹配規(guī)則,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • VisualStudio2022提交git代碼的方法實(shí)現(xiàn)

    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)雙目攝像頭拍照程序

    基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序

    這篇文章主要為大家詳細(xì)介紹了基于Opencv實(shí)現(xiàn)雙目攝像頭拍照程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • C++11范圍for初始化列表auto decltype詳解

    C++11范圍for初始化列表auto decltype詳解

    C++11引入auto類型推導(dǎo)、decltype類型推斷、統(tǒng)一列表初始化、范圍for循環(huán)及智能指針,提升代碼簡潔性、類型安全與資源管理效率
    2025-07-07
  • 自己簡單封裝的一個(gè)CDialog類實(shí)例

    自己簡單封裝的一個(gè)CDialog類實(shí)例

    這篇文章主要介紹了自己簡單封裝的一個(gè)CDialog類,實(shí)例分析了自定義封裝CDialog類的相關(guān)技巧,比較簡單易懂,需要的朋友可以參考下
    2015-04-04
  • C語言規(guī)避野指針的方法流程

    C語言規(guī)避野指針的方法流程

    野指針就是指針指向的不是一個(gè)有效(合法)的地址,在程序中,如果訪問野指針,可能會(huì)造成程序的崩潰,這篇文章主要介紹了C語言如何規(guī)避野指針,需要的朋友可以參考下
    2024-03-03
  • C語言 ffmpeg與sdl實(shí)現(xiàn)播放視頻同時(shí)同步時(shí)鐘詳解

    C語言 ffmpeg與sdl實(shí)現(xiàn)播放視頻同時(shí)同步時(shí)鐘詳解

    使用ffmpeg和sdl實(shí)現(xiàn)播放視頻后,需要再實(shí)現(xiàn)時(shí)鐘同步才能正常的播放視頻,尤其是有音頻的情況,我們通常需要將視頻同步到音頻來確保音畫同步
    2022-09-09

最新評(píng)論

石家庄市| 临夏市| 岳西县| 通辽市| 讷河市| 遂昌县| 色达县| 大厂| 大港区| 乐亭县| 花莲县| 泸水县| 奇台县| 大同市| 施秉县| 错那县| 米脂县| 淮阳县| 醴陵市| 阳城县| 盈江县| 澄迈县| 资溪县| 桃园市| 微山县| 响水县| 青海省| 环江| 沂南县| 芜湖市| 冕宁县| 德惠市| 丰都县| 津市市| 伊吾县| 霍邱县| 杨浦区| 岗巴县| 江西省| 巴林左旗| 株洲市|