STL容器上的C ++模板函数

时间:2013-04-17 13:28:43

标签: c++ stl iterator containers

我想编写一个计算STL容器中元素总和的泛型函数。我的方法如下(t是一个容器):

template <typename T> double Sum(const T& t){
    typename T::reverse_iterator rit  = t.rbegin();
    double dSum = 0.;
    while( rit != t.rend() ){
        dSum += (*rit);
            ++rit;
    }
    return dSum;
}

但是我遇到了很多错误。我想问题是关于我定义迭代器的第二行?非常感谢任何帮助:)

2 个答案:

答案 0 :(得分:5)

应该是

typename T::const_reverse_iterator rit  = t.rbegin();

由于tconstrbeginconst容器返回const_reverse_iterator,因此无法转换为reverse_iterator

最好使用std::accumulate,而不是你自己的功能,比如这个

double result = std::accumulate(c.rbegin(), c.rend(), 0.0);

答案 1 :(得分:1)

  

非常感谢任何帮助:)

如果您在生产代码中执行此操作,请改用std::accumulate:它是标准的生产质量代码,应该已经实施和测试。

如果您将此作为练习编写,请考虑以下事项:

  • 根据迭代器而不是容器来定义您的函数接口。 std :: library的最大优点之一是将容器逻辑(如何获取迭代器并推进它们)与您在迭代器上应用的算法(在本例中为Sum)分开。

例如(使用std :: accumulate),您可以将其称为std::accumulate(t.begin(), t.end(), 0)std::accumulate(t.rbegin(), t.rend(), 0)std::accumulate(t.cbegin(), t.cend(), 0)

  • 按值接收begin迭代器并直接递增(它将节省你在内部声明rit的需要;通过const引用接收结束迭代器。

  • 可选:设置总和的默认值(默认值应为零)。