在模板中奇怪地使用 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 );
它可以让你积累到已经开始的事情。因此,如果您累加值 3
和 4
,初始值为 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:
我在旧版本的 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 );
它可以让你积累到已经开始的事情。因此,如果您累加值 3
和 4
,初始值为 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: