累加
题目描述
实现函数模板 T accumulate(It begin, It end);
。其中,It
是指向 T
类型的迭代器。该函数返回 begin
到 end
这对迭代器所指明的范围中,所有元素的和。
和的定义是:给定一个初始值 init
,取值为 T{}
(值初始化 的结果)。随后,((((init + a0) + a1) + a2) + ... + an)
即为元素 a0
到 an
的和。
完成本题可能用到的知识:std::iterator_traits<It>::value_type
可以用来获取 It
迭代器所指向的元素类型。此外,如果声明变量时的类型名包含模板形参,则会引发歧义并导致编译错误。你可以使用 typename
消歧义符,也可以先声明一个类型别名然后再做处理。
关于输入
无
关于输出
见样例输出
参考答案
#include <iostream>
#include <vector>
#include <list>
template <typename It>
auto accumulate(It begin, It end) {
typename std::iterator_traits<It>::value_type v{};
while (begin != end) {
v = v + *begin;
++begin;
}
return v;
}
struct Rational {
int num;
int den;
Rational(int n = 0, int d = 1) : num{n}, den{d} {}
friend Rational operator+(const Rational& lhs, const Rational& rhs) {
return {lhs.num * rhs.den + lhs.den * rhs.num, lhs.den * rhs.den};
}
friend std::ostream& operator<<(std::ostream& os, const Rational& r) {
return os << r.num << '/' << r.den;
}
};
int main() {
std::string strArr[]{"Hello", "World", "From", "STL"};
int intArr[]{1, 2, 3, 4, 5};
std::vector<double> dblVec{1.414, 1.732, 2.236};
std::list<Rational> ratList{{1, 2}, {1, 3}, {1, 5}};
std::cout << accumulate(strArr, strArr + 4) << std::endl;
std::cout << accumulate(intArr, intArr + 5) << std::endl;
std::cout << accumulate(intArr, intArr) << std::endl;
std::cout << accumulate(dblVec.begin(), dblVec.end()) << std::endl;
std::cout << accumulate(ratList.begin(), ratList.end()) << std::endl;
}