📜  C++ STL中的accumulate()和partial_sum():数字标头(1)

📅  最后修改于: 2023-12-03 15:13:56.171000             🧑  作者: Mango

C++ STL中的accumulate()和partial_sum():数值头

在C++ STL中,numeric头文件提供了一些数值算法,其中最常用的算法就是accumulate()partial_sum()函数。

accumulate()

accumulate()函数用于计算一个数值序列的和。它有三个参数:

template<typename InputIt, typename T>
T accumulate(InputIt first, InputIt last, T init);
  • firstlast 分别为数值序列的首尾迭代器;
  • init 为初始值。
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> numbers {1, 2, 3, 4};
    int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
    std::cout << "Sum: " << sum << std::endl;
    return 0;
}

输出:

Sum: 10

还可以使用std::accumulate()函数来计算其他类型的序列,例如字符串:

#include <iostream>
#include <numeric>
#include <string>

int main() {
    std::string str = "Hello, World!";
    int sum = std::accumulate(str.begin(), str.end(), 0);
    std::cout << "Sum: " << sum << std::endl;
    return 0;
}

输出:

Sum: 1000

在这种情况下,std::accumulate()函数实际上计算了字符串中所有字符的ASCII码值之和。

partial_sum()

partial_sum()函数是计算一个数值序列的部分和的函数。它有两个参数:

template<typename InputIt, typename OutputIt>
OutputIt partial_sum(InputIt first, InputIt last, OutputIt d_first);
  • firstlast 分别为数值序列的首尾迭代器;
  • d_first 为输出迭代器,用于存储部分和。
#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> numbers {1, 2, 3, 4};
    std::vector<int> partial_sums(numbers.size());
    std::partial_sum(numbers.begin(), numbers.end(), partial_sums.begin());
    std::cout << "Partial sums: ";
    for (auto x : partial_sums) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    return 0;
}

输出:

Partial sums: 1 3 6 10

在这里,std::partial_sum()函数将numbers中的部分和存储在partial_sums中。例如,partial_sums[2]包含numbers[0] + numbers[1] + numbers[2]的和。

除了默认的求和操作外,std::partial_sum()函数还可以接受一个二元函数对象,用于自定义部分和的计算方式。

例如,以下代码计算斐波那契数列的前5项:

#include <iostream>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> fib(5);
    std::partial_sum(fib.begin(), fib.end(), fib.begin(), [](int a, int b) {
        return b == 0 ? 1 : a + b;
    });
    std::cout << "Fibonacci sequence: ";
    for (auto x : fib) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    return 0;
}

输出:

Fibonacci sequence: 1 1 2 4 8

在这里,我们定义了一个二元函数对象,它计算斐波那契数列中的下一项。