如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>

How to use 2 iterators for sum function calculating map <string, double>

本文关键字:lt 映射 字符串 gt 双精度 计算 函数 何使用 迭代器 求和      更新时间:2023-10-16

我正在研究一个关于 STL 迭代器的问题,问题是:创建一个 Sum() 函数来计算两个迭代器之间的总和。

template<class T1, class T2 >
double Sum<T1,T2>(map<T1,T2>& start, map<T1,T2>&end)   
{
double sum = 0.0;
class map<T1,T2>::const_iterator i;
for (i = start; i != end; ++i)
{
sum += i->second;
} 
return sum;
}

以下是我的主():

map<string, double>::const_iterator map_StartIter =doubleMap.begin();   
map<string, double>::const_iterator map_EndIter = doubleMap.end();
cout<<"(2 iterator) map Sum is "<< Sum(map_StartIter,map_EndIter) << endl;

它抛出错误说错误 C2768:"总和":非法使用显式模板参数

出了什么问题?

您遇到的特定错误是,您不应在其声明中的函数名称旁边再次指定模板参数:

template<class T1, class T2 >
double Sum<T1,T2>(map<T1,T2>& start, map<T1,T2>&end) 
^~~~~~~

如果删除了突出显示的部分,则会遇到下一个问题,即您接受的是两个映射而不是它们的迭代器:

template <class T1, class T2>
double Sum(typename std::map<T1, T2>::const_iterator it,
typename std::map<T1, T2>::const_iterator end)
{
double sum = 0.0;
for (; it != end; ++it)
{
sum += it->second;
} 
return sum;
}

注意:内部变量是不必要的,因为您应该通过复制来获取迭代器。

但是,这是非惯用代码:它非常冗长,并且阻止您通过std::unordered_mapstd::multimap传递迭代器(例如)。

相反,您可以简单地更上一层楼,并使用迭代器类型本身作为模板参数:

template <typename I>
double Sum(I it, I end)
{
double sum = 0.0;
for (; it != end; ++it)
{
sum += it->second;
} 
return sum;
}

最后,Sum函数的结果类型不适用于包含int64_t的地图。您可以改用迭代器的内部value_type来获取类型...但它很冗长,相反,使用decltype通常更简单:

template <typename I>
auto Sum(I it, I end) -> decltype(it->second)
{
decltype(it->second) sum = 0;
for (; it != end; ++it)
{
sum += it->second;
} 
return sum;
}

这样,当您添加整数时,您将获得一个整数。

应该是这样的:

template<class Iter >
double Sum(Iter begin, Iter end)
{
double sum = 0;
for( Iter it = begin; it != end; ++it )
sum += it->second;
return sum;
}

请注意,如果您需要按照您的说明计算map <string, double>,则不必使用模板,您可以指定具体类型。