繁体   English   中英

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

[英]C++ template function on a STL container

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

但是我遇到很多错误。 我猜问题出在第二行定义迭代器的地方? 将不胜感激:)

应该

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

由于tconstconst容器的rbegin返回const_reverse_iterator ,因此无法将其转换为reverse_iterator

最好使用std::accumulate ,而不是您自己的函数,像这样

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

将不胜感激:)

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

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

  • 用迭代器而不是容器定义函数接口。 std ::库的最大优势之一是,它将容器逻辑(如何获得迭代器并对其进行推进)与应用于迭代器的算法(在本例中为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引用接收end迭代器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM