c++ Std::accumulate 用于无序映射
c++ Std::accumulate for unordered map
我有一个函数应该在无序映射中累积所有值:
int sum_val(std::unordered_map<char, int> vm){
auto addition = [](int a, std::unordered_map<char, int>::iterator b){ return a + b->second; };
return std::accumulate(vm.begin(), vm.end(), 0, addition);
}
但是,当我尝试编译它时,出现以下错误:
error:
no matching function for call to object of type '(lambda at markov_gen.cpp:11:21)'
__init = __binary_op(__init, *__first);
markov_gen.cpp:11:21: note: candidate function not viable: no known conversion from
'std::__1::__hash_map_iterator<std::__1::__hash_iterator<std::__1::__hash_node<std::__1::__hash_value_type<char, int>, void *>
*> >::value_type' (aka 'pair<const char, int>') to 'std::unordered_map<char, int>::iterator' (aka
'__hash_map_iterator<__hash_iterator<std::__1::__hash_node<std::__1::__hash_value_type<char, int>, void *> *> >') for 2nd
argument
auto addition = [](int a, ITER b){ return a + b->second; };
我有点不明白为什么这个二元运算符 addition
不起作用。 vm.begin()
returns 指向无序映射中第一个元素的迭代器,因此是 std::unordered_map<char, int>::iterator
类型,并且由于我的累加输出应该是 int
,所以左边lambda 中的元素应该始终是 int
而正确的元素应该是迭代器,因为 std::accumulate
遍历无序映射中的每个键。因此, int + std::unordered_map<char, int>::iterator
的操作由我的匿名函数很好地定义。我哪里错了?
您应该已经传递了“解引用”迭代器类型。
int sum_val(std::unordered_map<char, int>& vm){
auto addition =
[](int a, const std::pair<const char,int>& b)
{ return a + b.second; };
return std::accumulate(vm.begin(), vm.end(), 0, addition);
}
@rjc810 你找错地方了恕我直言:
The signature of the function should be equivalent to the following: Ret fun(const Type1 &a, const Type2 &b);
accumulate doc。
没错,它还声明“签名不需要有 const &.”,这意味着“如果它便宜,你可以自由地传递值”。
但只要确保密钥的常量性(即它是 pair<const char, int>
,任何引用都应该这样做)。
至于How can I confirm that the "dereferenced" iterator type is a const pair
:如果不修改参数,则通过const 引用传递被认为是一种很好的做法。但是 accumulate 的规范对此非常明确。
至于对:unordered_map,请参见代码示例(但说实话,它可以更明确一些)。
我有一个函数应该在无序映射中累积所有值:
int sum_val(std::unordered_map<char, int> vm){
auto addition = [](int a, std::unordered_map<char, int>::iterator b){ return a + b->second; };
return std::accumulate(vm.begin(), vm.end(), 0, addition);
}
但是,当我尝试编译它时,出现以下错误:
error:
no matching function for call to object of type '(lambda at markov_gen.cpp:11:21)'
__init = __binary_op(__init, *__first);
markov_gen.cpp:11:21: note: candidate function not viable: no known conversion from
'std::__1::__hash_map_iterator<std::__1::__hash_iterator<std::__1::__hash_node<std::__1::__hash_value_type<char, int>, void *>
*> >::value_type' (aka 'pair<const char, int>') to 'std::unordered_map<char, int>::iterator' (aka
'__hash_map_iterator<__hash_iterator<std::__1::__hash_node<std::__1::__hash_value_type<char, int>, void *> *> >') for 2nd
argument
auto addition = [](int a, ITER b){ return a + b->second; };
我有点不明白为什么这个二元运算符 addition
不起作用。 vm.begin()
returns 指向无序映射中第一个元素的迭代器,因此是 std::unordered_map<char, int>::iterator
类型,并且由于我的累加输出应该是 int
,所以左边lambda 中的元素应该始终是 int
而正确的元素应该是迭代器,因为 std::accumulate
遍历无序映射中的每个键。因此, int + std::unordered_map<char, int>::iterator
的操作由我的匿名函数很好地定义。我哪里错了?
您应该已经传递了“解引用”迭代器类型。
int sum_val(std::unordered_map<char, int>& vm){
auto addition =
[](int a, const std::pair<const char,int>& b)
{ return a + b.second; };
return std::accumulate(vm.begin(), vm.end(), 0, addition);
}
@rjc810 你找错地方了恕我直言:
The signature of the function should be equivalent to the following: Ret fun(const Type1 &a, const Type2 &b);
accumulate doc。
没错,它还声明“签名不需要有 const &.”,这意味着“如果它便宜,你可以自由地传递值”。
但只要确保密钥的常量性(即它是 pair<const char, int>
,任何引用都应该这样做)。
至于How can I confirm that the "dereferenced" iterator type is a const pair
:如果不修改参数,则通过const 引用传递被认为是一种很好的做法。但是 accumulate 的规范对此非常明确。
至于对:unordered_map,请参见代码示例(但说实话,它可以更明确一些)。