在模板中奇怪地使用 std::accumulate

Odd use of std::accumulate in a template

我在旧版本的 C++ Cookbook 中看到这段代码,这让我很困惑。这似乎可以编译,但我不知道为什么要这样写代码。

T() 是什么意思?这是 std::accumulate 的初始参数——开始求和的值。我写了一个版本,我把 double() 放在 T() 的位置("hardwire" 模板),然后编译。 double() 是什么意思?

#include <iostream>
#include <numeric> // accumulate
#include <vector>

template<class T, class Iter_T>
void computeAccum(Iter_T first, Iter_T last, T& accum)
{
    accum = std::accumulate(first, last, T()); // Why is init argument equal to T()?
}

int main()
{
    std::vector<double> vd;
    vd.push_back(1.11);
    vd.push_back(2.22);
    vd.push_back(4.44);
    vd.push_back(3.33);
    double sum1;
    std::cout << "Here is the vector:" << std::endl;
    std::vector<double> ::iterator it;
    for (it = vd.begin(); it != vd.end(); ++it) {
        std::cout << *it << std::endl;
    }

    computeAccum2(vd.begin(), vd.end(), sum1);
    std::cout << "Answer: " << sum1 << std::endl;
}

累加器的这个变体有三个参数,范围中的第一个和最后一个元素,以及开始的初始值(下面这个特定的原型是 C++20 的,尽管早期的原型是相似的,只是少 constexpr 善良):

template< class InputIt, class T >
constexpr T accumulate( InputIt first, InputIt last, T init );

它可以让你积累到已经开始的事情。因此,如果您累加值 34,初始值为 22,最终值为 28。这样做的原因是因为您可能希望累积某组数据,然后再累积更多。 通过使用初始起始值,您可以将多个累积到一个项目中。

在这种情况下,T() 只是模板类型的默认构造初始元素,基本上是您使用的任何类型的 "zero" 值。

基本上是零初始化。考虑这个例子来澄清

#include <bits/stdc++.h> 
using namespace std;

int main(){
    cout<<"Int: "<<int()<<endl;
    cout<<"Float: "<<float()<<endl;
    cout<<"String: "<<string();
}

输出:

Int: 0
Float: 0
String: