我只是想创建一个简单的求和函数模板,以使用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;'
我在这里使用指针错了什么?谢谢!
答案 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;
}