试图创建容器的简单模板总和

时间:2012-09-30 17:15:36

标签: templates stl iterator

我只是想创建一个简单的求和函数模板,以使用STL查找容器中的双精度总和。首先,我只是想用一个列表来测试它,但我在第28行时遇到错误。

#include <iterator>
#include <list>    
#include <iostream>

using namespace std;

template <typename T>
double Sum(typename T& container)
{// sum of a container with doubles
    typename T::const_iterator iterator_begin = container.begin();
    typename T::const_iterator iterator_end = container.end();

    double my_sum = 0;

    for (iterator_begin; iterator_begin != iterator_end; iterator_begin++)
        my_sum += iterator_begin->second; // this is line 28

        return my_sum;
}

int main()
{
    list<double> test_list(10,5.1); // create a list of size 10 with values 5.1

    cout << Sum(test_list) << endl;

    return 0;
}

我遇到两个编译器错误:

  

c:\ users ... \ iterators.cpp(28):错误C2839:返回类型无效   'const double *'用于重载'运算符 - &gt;'

     

c:\ users ... \ iterators.cpp(28):错误C2039:'second':不是   'std :: _ List_const_iterator&lt; _Mylist&gt;'

的成员

即使我从const_iterator更改为迭代器,我仍然会收到类似的错误,

  

错误C2839:重载'运算符的返回类型'double *'无效    - &GT;'

我在这里使用指针错了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

STL列表不支持'second'的概念。它们是简单的序列。这似乎最初是为std :: map&lt;&gt;定制的。话虽这么说,如果列表,向量,队列等是你的目标容器,那么:

改变这个:

my_sum += iterator_begin->second;

到此:

my_sum += *iterator_begin;

它将按照您显然想要的方式工作。有 内置算法用于在STL(for_each等等)中执行此类操作,您应该将其视为潜在的替代方案。

编辑:OP询问如何专门为简单序列和地图求和。

#include <iostream>
#include <list>
#include <map>

using namespace std;

// general summation
template<typename T>
double Sum(const T& container)
{
    double result = 0.0;
    typename T::const_iterator it = container.begin();
    while (it != container.end())
        result += *it++;
    return result;
}

// specialized for a map of something-to-double
template<typename Left>
double Sum(const map<Left,double>& themap)
{
    double result = 0.0;
    typename map<Left,double>::const_iterator it = themap.begin();
    while (it != themap.end())
        result += (it++)->second;
    return result;
}

// a list of doubles.
typedef list<double> DblList;

// a map of int to double
typedef map<int, double> MapIntToDbl;

// and just for kicks, a map of strings to doubles.
typedef map<string, double> MapStrToDbl;


int main(int argc, char** argv)
{
    DblList dbls;
    dbls.push_back(1.0);
    dbls.push_back(2.0);
    dbls.push_back(3.0);
    dbls.push_back(4.0);
    cout << "Sum(dbls) = " << Sum(dbls) << endl;

    MapIntToDbl mapdbls;
    mapdbls[1] = 1.0;
    mapdbls[2] = 2.0;
    mapdbls[3] = 3.0;
    mapdbls[4] = 4.0;
    mapdbls[5] = 5.0;
    cout << "Sum(mapdbls) = " << Sum(mapdbls) << endl;

    MapStrToDbl mapdbls2;
    mapdbls2["this"] = 1.0;
    mapdbls2["is"] = 2.0;
    mapdbls2["another"] = 3.0;
    mapdbls2["map"] = 4.0;
    mapdbls2["sample"] = 5.0;
    cout << "Sum(mapdbls2) = " << Sum(mapdbls2) << endl;

    return 0;
}