如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
How to use 2 iterators for sum function calculating map <string, double>
我正在研究一个关于 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_map
或std::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>
,则不必使用模板,您可以指定具体类型。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- 呼叫运营商<<临时
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- std::映射<>或std::vector<>在处理大型标志集时