首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 容器遍歷完整指南:for_each、仿函式、Lambda 與範圍 for 跨語言對比

     編輯:C++ 入門

容器遍歷是日常開發高頻操作。C++ 提供 for_each 算法、仿函式、Lambda 運算式、範圍 for(C++11)多種方式。本文系統對比 Java Iterator、C# foreach、C++ 三代遍歷演進,深度解析 for_each + 仿函式/Lambda 實戰模式、範圍 for 優勢、平行算法整合,建立現代遍歷最佳實踐。

跨語言遍歷對比

語言經典方式現代語法型別安全
JavaIterator + hasNext/nextfor (Item item : list) (JDK 5)泛型編譯期檢查
C#IEnumerator + MoveNext/Currentforeach (var item in list)泛型編譯期檢查 (C# 2.0)
C++for_each(begin, end, func)for (auto& item : container) (C++11)模板實例化檢查

C++ 三代遍歷演進

第一代:for_each + 仿函式


template <class T>
class AddValue {
    T theValue;
public:
    AddValue(const T& v) : theValue(v) {}
    void operator()(T& elem) const { elem += theValue; }
};

vector<int> v = {1,2,3,4,5};
for_each(v.begin(), v.end(), AddValue<int>(10));  // 每元素 +10

缺點:需定義類別、重載 operator()、樣板參數冗長。

第二代:for_each + Lambda (C++11)


int total = 0;
for_each(v.begin(), v.end(), [&total](int x) { total += x; });

// 無捕獲
for_each(v.begin(), v.end(), [](int x) { cout << x << ' '; });

// 混合捕獲
bool display = true;
for_each(v.begin(), v.end(), [&total, display](int x) {
    total += x;
    if (display) cout << x << endl;
});

優勢:就地定義、捕獲區域變數、無類別開銷。

第三代:範圍 for (C++11)


for (auto& x : v) x += 10;           // 修改元素
for (const auto& x : v) cout << x;   // 唯讀
for (auto x : v) { ... }             // 複本(避免修改原容器)

優勢:語法最簡潔、編譯器展開為迭代器版本、支援陣列/初始化列表/自定義類型(需 begin/end)。

平行遍歷 (C++17)


#include 
#include 

for_each(execution::par, v.begin(), v.end(), 
         [](int& x) { x *= 2; });  // 平行執行,需線程安全操作

// 或使用 transform_reduce 等平行算法

現代最佳實踐選擇指南

總結

從仿函式到 Lambda 再到範圍 for,C++ 遍歷演進體現「宣告式、零開銷、型別安全」核心哲學。現代專案:90% 場景用範圍 for,10% 複雜捕獲用 for_each+Lambda,計算密集用平行算法。C++20 Ranges 進一步統一管線語法,值得持續關注。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦方式理由
簡單修改/唯讀遍歷範圍 for語法最清晰、零開銷
需捕獲區域狀態/複雜邏輯for_each + Lambda捕獲靈活、就地定義
函式式風格/可組合管線views + ranges (C++20)惰性評估、管線組合
大數據/計算密集平行算法多核加速、自動排程
舊代碼維護for_each + 仿函式相容性、無 Lambda 支援環境