C++--范圍for循環詳解

范圍 for 循環是 C++11 引入的語法特性,用于簡化遍歷容器或數組元素的過程。它比傳統 for 循環更簡潔安全,特別適合初學者。以下是詳細講解:


基本語法

for (元素類型 變量名 : 容器/數組) {// 循環體(使用變量名訪問當前元素)
}

或使用 auto 自動推斷類型:

for (auto 變量名 : 容器/數組) {// 循環體
}

與普通 for 循環對比

傳統遍歷向量的方式:

for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) 
{// 使用 *it 訪問元素
}

范圍 for 循環更簡潔,可讀性更強,且不易出錯(如避免了迭代器越界等問題)。


關鍵特點

  1. 自動遍歷:無需手動控制索引或迭代器
  2. 邊界安全:自動處理開始和結束位置,避免越界
  3. 簡潔性:代碼更易讀,減少錯誤

底層原理

范圍 for 循環會遍歷給定容器(或數組)中的每一個元素。在每次迭代中,它會將當前元素復制到循環變量中(注意:這里是復制)。如果你希望避免復制,特別是當容器元素較大時,可以使用引用(如 auto&const auto&)。

編譯器將范圍 for 轉換為迭代器操作:

// 原始代碼
for (auto x : container) { ... }// 等效的傳統代碼
for (auto it = begin(container); it != end(container); ++it) {auto x = *it;  // 注意:這里是值拷貝!...
}

使用示例

示例 1:遍歷數組
int numbers[] = {10, 20, 30, 40};// 傳統 for 循環
for (int i = 0; i < 4; ++i) {cout << numbers[i] << " ";
}// 范圍 for 循環(更簡潔!)
for (int num : numbers) {cout << num << " ";
}
// 輸出:10 20 30 40
示例 2:遍歷 vector
#include <vector>
#include <iostream>
using namespace std;int main() {vector<string> fruits = {"Apple", "Banana", "Cherry"};// 使用 auto 自動推斷類型for (auto fruit : fruits) {cout << fruit << " ";}// 輸出:Apple Banana Cherry
}

修改元素(使用引用)

若需修改容器中的元素,需使用引用 &

vector<int> scores = {80, 90, 70};// 給每個成績加10分
for (auto& score : scores) {  // 注意 & 符號score += 10;
}// 驗證結果
for (auto s : scores) {cout << s << " ";  // 輸出:90 100 80
}

只讀場景(使用 const 引用)

當不需要修改元素時,使用 const auto& 避免復制開銷:

vector<string> names = {"Alice", "Bob", "Charlie"};// 高效只讀訪問(尤其對大型對象)
for (const auto& name : names) {cout << name.length() << " ";  // 輸出:5 3 7
}

支持的數據類型

范圍 for 循環可用于:

  • 原生數組(如 int arr[5]
  • STL 容器(vector, list, map, set 等)
  • 自定義類型(需實現 begin()end() 成員函數)
  • 初始化列表(如 {1,2,3}

注意事項

  1. 容器必須支持迭代器:范圍 for 循環內部使用迭代器,因此容器必須具有 begin()end() 成員函數,或者是數組。

  2. 不能修改容器結構:在范圍 for 循環中,不能添加或刪除容器中的元素,否則可能導致迭代器失效,引發未定義行為。

  3. 元素訪問方式

  • 使用 auto:創建元素的副本(適用于基本類型或需要修改但不影響原容器的情況)。

  • 使用 auto&:引用元素,可以修改元素(修改會影響原容器)。

  • 使用 const auto&:常量引用,只讀且避免復制(適用于大對象或只讀遍歷)。


經典應用場景

  1. 遍歷數組/容器處理數據
  2. 配合 STL 算法快速操作
  3. 處理字符串字符:
    string msg = "Hello";
    for (char c : msg) {cout << c << "-";  // 輸出:H-e-l-l-o-
    }
    

建議:在 C++11 及以上版本中,優先使用范圍 for 替代傳統 for 循環,代碼更簡潔安全。掌握后你會愛上它!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85575.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RDMA簡介1之RDMA開發必要性

為了滿足大批量數據的采集、存儲與傳輸需求&#xff0c;越來越多的數據密集型應用如機器學習、雷達、金融風控、航空航天等選擇使用現場可編程邏輯門陣列作為數據采集前端硬件來實現高性能的數據采集系統。FPGA憑借其高靈活性、高并行能力及可高度定制化的特點&#xff0c;能夠…

xmake的簡易學習

文章目錄 1. xmake是什么2. 一個可執行程序3. 一個庫文件4. 遍歷文件用法5. 第三方庫3.1 系統安裝庫3.2 獨立庫 6. 后續 由于前一篇博客的最后說要做一些rknn的優化&#xff0c;其實這個工作很早就完成了&#xff0c;但是我是使用 xmake這個來做我的工程的構建的&#xff0c;不…

【ArcGIS微課1000例】0147:Geographic Imager6.2下載安裝教程

文章目錄 一、軟件功能二、下載地址三、安裝教程Geographic Imager地圖工具使Adobe Photoshop空間圖像可以快速高效地工作。它增加了導入,編輯,操作和導出地理空間圖像的工具,例如航空和衛星圖像。Geographic Imager Mac功能非常強大,擁有柵格數據輸出、投影信息修改、基于…

【 java 集合知識 第一篇 】

1.概念 1.1.集合與數組的區別 集合&#xff1a;長度不固定&#xff0c;動態的根據數據添加刪除改變長度&#xff0c;并且只能存入引用類型&#xff0c;讀取采用迭代器或其他方法 數組&#xff1a;長度固定&#xff0c;不可改變&#xff0c;既可以存入基本類型也可以存入引用…

嵌入式開發學習日志(linux系統編程--系統編程之 進程間通信IPC)Day32

一、引言 空間獨立&#xff0c;需要一些操作&#xff1b; 分為三大類&#xff1a; 1、古老的通信方式 無名管道 有名管道 信號 2、IPC對象通信 system v BSD suse fedora kernel.org 消息隊列(用的相對少&#xff0c;這里不討論) …

metersphere不同域名的參數在鏈路測試中如何傳遞?

域名1&#xff1a;https://api.domain1.com 域名2&#xff1a;https://api.domain2.com 域名1的返回參數stteid會作為域名2的入參 步驟&#xff1a; 1&#xff09;先在metersphere—接口測試—接口定義中創建域名1和域名2的接口 2&#xff09;接口創建好后&#xff0c;在接口測…

使用Process Explorer、System Informer(Process Hacker)和Windbg工具排查軟件高CPU占用問題

目錄 1、問題現象 2、使用Process Explorer和System Informer&#xff08;該工具原先叫Process Hacker&#xff09;查看占用CPU高的線程 3、使用System Informer工具時發現了一個關鍵細節 4、將Windbg附加到軟件進程上&#xff0c;根據System Informer中顯示的線程id到Wind…

Linux(線程概念)

目錄 一 虛擬地址到物理地址的轉換 1. 操作系統如何管理物理內存&#xff1a; 2. 下面來談談虛擬地址如何轉換到物理地址&#xff1a; 3. 補充字段&#xff1a; 二 Linux中的線程 1. 先來說說進程&#xff1a; 2. 線程&#xff1a; 3. 線程相比較于進程的優缺點&#x…

阿里云為何,一個郵箱綁定了兩個賬號

阿里云“幽靈賬號”之謎&#xff1a;同一個郵箱注銷后仍有兩個賬號&#xff1f;深度揭秘成因與終極解決方案&#xff01; 你是否曾在阿里云上使用同一個郵箱注冊過多個賬號&#xff0c;明明已經**“徹底”注銷了其中一個**&#xff0c;卻驚愕地發現系統里依然**“幽靈般”掛著…

動態規劃-數位DP

今天開始做關于數位DP的問題&#xff0c;首先對于數位DP來說&#xff0c;這類問題難度較大&#xff0c;比較難理解&#xff0c;所以博主也會盡量講的更加詳細一些&#xff0c;來幫助大家更好地理解這里的相關知識。 前置知識&#xff1a; 1.首先對于數位DP來說&#xff0c;主…

總覽四級考試

別被“四級”這個龐然大物嚇到&#xff01;我們一起拆解它&#xff1a;?? &#x1f4cd; ??核心認知&#xff1a;四級是一場策略性考試&#xff01;?? 它不考智商&#xff0c;考的是??基礎英語能力 考試技巧 時間管理??。基礎可以通過努力補&#xff0c;技巧可以…

BSRR對比BRR對比ODR

? 三種操作方式的本質區別 寄存器功能原子操作特點BSRR同時支持置位(1)和復位(0)?? 是單指令完成任意位操作&#xff0c;無競爭風險ODR直接讀寫輸出狀態? 否需"讀-改-寫"&#xff0c;多線程/中斷中需關中斷保護BRR只能復位(0)?? 是僅清零功能&#xff0c;無置…

職坐標精選嵌入式AI物聯網開源項目

隨著嵌入式、AI與物聯網技術的深度融合&#xff0c;開源生態已成為開發者構建智能硬件解決方案的核心驅動力。本文將從嵌入式實時操作系統、多模態AI數據集及物聯網接入平臺三大維度切入&#xff0c;系統性梳理技術選型要點與實踐路徑。在嵌入式領域&#xff0c;重點解析低功耗…

Ubuntu系統 | 本地部署ollama+deepseek

1、Ollama介紹 Ollama是由Llama開發團隊推出的開源項目,旨在為用戶提供高效、靈活的本地化大型語言模型(LLM)運行環境。作為Llama系列模型的重要配套工具,Ollama解決了傳統云服務對計算資源和網絡連接的依賴問題,讓用戶能夠在個人電腦或私有服務器上部署和運行如Llama 3等…

【數據庫】關系數據庫標準語言-SQL(金倉)下

4、數據查詢 語法&#xff1a; SELECT [ALL | DISTINCT] <目標列表達式> [,<目標列表達式>] … FROM <表名或視圖名>[, <表名或視圖名> ] … [ WHERE <條件表達式> ] [ GROUP BY <列名1> [ HAVING <條件表達式> ] ] [ ORDER BY <…

基于YOLO-NAS-Pose的無人機象群姿態估計:群體行為分析的突破

【導讀】 應對氣候變化對非洲象的生存威脅&#xff0c;本研究創新采用無人機航拍結合AI姿態分析技術&#xff0c;突破傳統觀測局限。團隊在肯尼亞桑布魯保護區對比測試DeepLabCut與YOLO-NAS-Pose兩種模型&#xff0c;首次將后者引入野生動物研究。通過檢測象群頭部、脊柱等關鍵…

8.RV1126-OPENCV 視頻中添加LOGO

一.視頻中添加 LOGO 圖像大體流程 首先初始化VI,VENC模塊并使能&#xff0c;然后創建兩個線程&#xff1a;1.把LOGO灰度化&#xff0c;然后獲取VI原始數據&#xff0c;其次把VI數據Mat化并創建一個感興趣區域&#xff0c;最后把LOGO放感興趣區域里并把數據發送給VENC。2.專門獲…

AI+3D 視覺重塑塑料袋拆垛新范式:遷移科技解鎖工業自動化新高度

在工業自動化浪潮席卷全球的當下&#xff0c;倉儲物流環節的效率與精準度成為企業降本增效的關鍵戰場。其中&#xff0c;塑料袋拆垛作為高頻、高重復性的作業場景&#xff0c;傳統人工或機械臂操作面臨著諸多挑戰。遷移科技&#xff0c;作為行業領先的 3D 工業相機和 3D 視覺系…

MATLAB實戰:視覺伺服控制實現方案

以下是一個基于MATLAB的視覺伺服控制項目實現方案&#xff0c;結合實時圖像處理、目標跟蹤和控制系統設計。我們將使用模擬環境進行演示&#xff0c;但代碼結構可直接應用于真實硬件。 系統架構 圖像采集 → 目標檢測 → 誤差計算 → PID控制器 → 執行器控制 完整代碼實現 …

RequestRateLimiterGatewayFilterFactory

一、功能說明 RequestRateLimiterGatewayFilterFactory 是 Spring Cloud Gateway 的流量控制組件&#xff0c;用于實現 API 請求速率限制&#xff0c;核心功能包括&#xff1a; 限制單位時間內的請求數量&#xff08;如每秒10次&#xff09;防止服務被突發流量擊垮&#xff0…