在 C++ 標準庫中,泛型算法的“只讀算法”指那些 不會改變它們所操作的容器中的元素,僅用于訪問或獲取信息的算法,例如查找、計數、遍歷等操作。
accumulate
std::accumulate()是 C++ 標準庫**numeric**頭文件中提供的算法,用于對序列(如數組、容器等)進行累積計算。以下是其詳細用法和常見場景:-
函數原型
template <class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init);template <class InputIt, class T, class BinaryOperation>
T accumulate(InputIt first, InputIt last, T init, BinaryOperation op);
參數:
○ first, last:輸入范圍的迭代器(左閉右開區間 [first, last))。
○ init:累積的初始值。
○ op:二元操作函數(可選,默認為加法)。
-
基本實例:累加求和
#include <iostream>
#include <vector>
#include <numeric> // 必須包含此頭文件int main() {std::vector<int> nums = {1, 2, 3, 4, 5};// 累加求和(初始值為 0)int sum = std::accumulate(nums.begin(), nums.end(), 0);std::cout << "Sum: " << sum << std::endl; // 輸出 Sum: 15return 0;
}
-
自定義操作:累乘
#include <vector>
#include <numeric>int main() {std::vector<int> nums = {2, 3, 4};// 初始值為 1,使用乘法操作int product = std::accumulate(nums.begin(), nums.end(), 1, [](int a, int b) { return a * b; });std::cout << "Product: " << product << std::endl; // 輸出 Product: 24return 0;
}
-
自定義操作:字符串連接
#include <vector>
#include <string>
#include <numeric>int main() {std::vector<std::string> words = {"Hello", " ", "World", "!"};// 初始值為空字符串,使用字符串連接std::string sentence = std::accumulate(words.begin(), words.end(), std::string(""), [](const std::string& a, const std::string& b) { return a + b; });std::cout << sentence << std::endl; // 輸出 Hello World!return 0;
}
-
常見錯誤
std::vector<double> vals = {1.5, 2.5, 3.5};// 錯誤!初始值 0 是 int 類型,結果會被截斷為 int
double sum = std::accumulate(vals.begin(), vals.end(), 0); // 正確:初始值應為 0.0(double 類型)
double correct_sum = std::accumulate(vals.begin(), vals.end(), 0.0);
std::vector<int> empty_vec;// 危險!若容器為空,直接使用 begin() 和 end() 會導致未定義行為
int sum = std::accumulate(empty_vec.begin(), empty_vec.end(), 0); // 結果為 0(安全)// 但更安全的做法是檢查容器是否為空
if (!empty_vec.empty()) {sum = std::accumulate(empty_vec.begin(), empty_vec.end(), 0);
}
-
進階用法:自定義對象累積
struct Point {double x, y;Point operator+(const Point& other) const {return {x + other.x, y + other.y};}
};int main() {std::vector<Point> points = {{1, 2}, {3, 4}, {5, 6}};Point total = std::accumulate(points.begin(), points.end(), Point{0, 0}, [](const Point& a, const Point& b) { return a + b; });std::cout << "Total: (" << total.x << ", " << total.y << ")" << std::endl;// 輸出 Total: (9, 12)return 0;
}
-
總結
用途:std::accumulate 是一個靈活的算法,適用于求和、求積、字符串拼接、對象合并等場景。
性能:時間復雜度為 O(n),是線性操作。
注意:始終確保初始值類型與操作邏輯匹配,避免迭代器越界