累加

题目描述

实现函数模板 T accumulate(It begin, It end);。其中,It 是指向 T 类型的迭代器。该函数返回 beginend 这对迭代器所指明的范围中,所有元素的

的定义是:给定一个初始值 init,取值为 T{}值初始化 的结果)。随后,((((init + a0) + a1) + a2) + ... + an) 即为元素 a0an

完成本题可能用到的知识: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;
}