0

我想编写一个通用函数来计算 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;
}

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

4

2 回答 2

5

应该

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

因为tisconstrbeginforconst容器返回const_reverse_iterator,所以不能转换为reverse_iterator.

会更好用std::accumulate,而不是你自己的函数,像这样

double result = std::accumulate(c.rbegin(), c.rend(), 0.0);
于 2013-04-17T13:32:31.323 回答
1

将不胜感激任何帮助:)

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

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

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

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

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

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

于 2013-04-17T13:42:09.027 回答