首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++11 範圍 for 循環:必須用引用類型才能修改元素

     編輯:程式設計綜合問答

C++11 範圍 for(for (auto x : vec))默認按值拷貝,循環體內修改 x 不影響容器原元素。需改為引用類型(auto& x 或 auto&& x)才能寫回。

錯誤示例

vector<int> v = {1,2,3};
for (auto x : v) { x *= 2; } // x 是副本,v 不變
// v 仍為 {1,2,3}

正確寫法

// 修改元素:左值引用
for (auto& x : v) { x *= 2; } // v 變為 {2,4,6}

// 僅讀取:const 引用(避免拷貝大對象)
for (const auto& x : v) { cout << x; }

// 通用引用(C++14 起,適配移動語義)
for (auto&& x : v) { /* 可讀可寫,支持右值範圍 */ }

原理圖解

for (auto x : v)   →  自動展開為  for (auto it = begin(v); it != end(v); ++it) { auto x = *it; ... }
for (auto& x : v)  →  展開為                       { auto& x = *it; ... }  // 綁定原元素

常見場景

  • 修改結構體字段:for (auto& s : vec) s.flag = true;
  • 移動語義轉移所有權:for (auto&& s : vec) process(std::move(s));
  • 遞歸遍歷樹:for (auto&& child : node.children) dfs(child);

口訣:要改元素,加 &;只讀取,加 const &;不確定,用 &&。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved