2013-04-17 83 views
0

我想写一个计算STL容器中元素总和的泛型函数。我去了解它的方式如下(t是一个容器):STL容器上的C++模板函数

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; 
} 

,但我得到了一大堆错误。我想这个问题是关于我定义迭代器的第二行吗?希望得到任何帮助:)

+3

像['标准:: accumulate'(http://en.cppreference.com/w/cpp/algorithm/accumulate)? –

+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

希望得到任何帮助:)

如果您在生产代码中这样做,使用改为:这是标准的生产质量代码,应该已经实施和测试。

如果你正在写它作为一个练习,考虑以下因素:

  • 定义函数接口迭代器而言,不是容器。 std :: library的最大优点之一就是将你在迭代器上应用的算法(在这种情况下为Sum)与容器逻辑分开(你如何获得迭代器并将它们推进)。

例如(以标准::累加),你可以把它作为std::accumulate(t.begin(), t.end(), 0)std::accumulate(t.rbegin(), t.rend(), 0)std::accumulate(t.cbegin(), t.cend(), 0)

  • 接收值开始迭代器,并直接增加它(这将节省您需要在内部宣布RIT;通过常量引用收到结束迭代

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

+0

迭代器很好,但是例如使用cont大多数情况下,食品或范围。 – ForEveR