Templates 尝试创建容器的简单模板和

Templates 尝试创建容器的简单模板和,templates,stl,iterator,Templates,Stl,Iterator,我只是想创建一个简单的求和函数模板,用STL在一个容器中查找双精度的和。首先,我只是想用一个列表来测试这个问题,但我在第28行不断得到一个错误 #include <iterator> #include <list> #include <iostream> using namespace std; template <typename T> double Sum(typename T& container) {// sum of

我只是想创建一个简单的求和函数模板,用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;
}
#包括
#包括
#包括
使用名称空间std;
模板
双和(类型名称T&container)
{//具有双精度的容器的和
typename T::const_iterator iterator_begin=container.begin();
typename T::const_iterator iterator_end=container.end();
我的两倍总和=0;
for(迭代器_begin;迭代器_begin!=迭代器_end;迭代器_begin++)
my_sum+=迭代器\u begin->second;//这是第28行
还我的钱;
}
int main()
{
list test_list(10,5.1);//创建一个大小为10、值为5.1的列表

coutSTL列表不支持“第二个”的概念。它们是简单的序列。这似乎最初是为std::map定制的。也就是说,如果列表、向量、队列等是您的目标容器,那么:

更改此项:

my_sum += iterator_begin->second;
为此:

my_sum += *iterator_begin;
<> p>它会按你想要的方式工作。在STL(For每一个等等…)中都有内置的算法,你应该把它们看作是潜在的替代品。 编辑: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;
}
#包括
#包括
#包括
使用名称空间std;
//一般求和
模板
双和(常数T和容器)
{
双结果=0.0;
typename T::const_迭代器it=container.begin();
while(it!=container.end())
结果+=*it++;
返回结果;
}
//专门用来绘制要翻倍的东西的地图
模板
双和(常量映射和主题映射)
{
双结果=0.0;
typename映射::const_迭代器it=themap.begin();
while(it!=themap.end())
结果+=(it++)->秒;
返回结果;
}
//双打名单。
typedef列表DblList;
//int到double的映射
typedef映射mapintodbl;
//只是为了踢,一张双打的弦图。
typedef映射映射strtodbl;
int main(int argc,字符**argv)
{
DblList-dbls;
dbls.推回(1.0);
dbls.推回(2.0);
dbls.推回(3.0);
dbls.推回(4.0);

我如何才能使这个函数适用于std::map?也就是说,我想为map创建一个重载函数。因此,我将第28行保持不变,并将“double Sum(typename T&container)”更改为“double Sum(typename map&container)”?我在那里也遇到了一些错误。我应该在另一个线程中发布这些错误吗?这是因为你的求和模板访问容器的方式导致了你的错误。可能需要为你的案例专门化,但我再次强调,它有太多奇妙的容器操作函数,几乎可以为你完成所有这些。Star使用std::for_,并查看它是如何紧密工作的。谢谢。实际上我有一个家庭作业,指定我使用stl迭代器编写重载求和函数。您已经确定了第一个,第二个只是第一个的特化,容器类型被指定为要加倍的某个对象的抽象映射。我将用一个你如何做到这一点的例子来更新答案。这不是唯一的方法,我只是想把它解决掉,但是看看。