首頁 > 軟體

C++ STL 中的數值演演算法範例講解

2022-04-08 13:02:01

以下演演算法均包含在標頭檔案 numeric 中

1.iota

該函數可以把一個範圍內的序列從給定的初始值開始累加
先看用法。
例:
假設我需要一個長度為10,從5開始遞增的序列

    vector<int> a(10);
    iota(begin(a), end(a), 5);

    for (auto x : a) {
        cout << x << " ";
    }

輸出:

5 6 7 8 9 10 11 12 13 14

這樣就可以很方便的建立一個遞增的序列,而不用使用for迴圈
此外,該函數是使用連續的支援 operator++()的 T 型別值填充序列
也就是說double型別也可以使用,string型別也可以使用。
只要是過載了++運運算元的型別都可以使用。

2.accumulate

曾經在演演算法比賽中看見別人使用accumulate函數計算出了一個陣列的和。
覺得特別的優雅,像這樣:

    vector<int> a(10);
    iota(begin(a), end(a), 1);

    cout << accumulate(begin(a), end(a), 0) << "n";  // 計算從1加到10的和,從0開始加

輸出:

55

從那天起,每當我要求一個序列的和的時候,我都會使用這個方法...
但是今天,當我看到accumulate的原始碼之後:

template <class InputIterator, class T>
   T accumulate (InputIterator first, InputIterator last, T init)
{
  while (first!=last) {
    init = init + *first;  // or: init=binary_op(init,*first) for the binary_op version
    ++first;
  }
  return init;
}

注意看這裡:

哇哦,它竟然還支援二元仿函數,詳解C++ functional庫中的仿函數使用方法
於是,我有了一個大膽的想法。
求一個陣列的乘積

    vector<int> a(10);
    iota(begin(a), end(a), 1);

    cout << accumulate(begin(a), end(a), 1, multiplies<int>()) << "n";  // 計算從1加到10的乘積,從1開始乘

輸出:

3628800

同理,還可以求陣列的減,陣列的除,陣列的模


IT145.com E-mail:sddin#qq.com