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,请参见代码示例(但说实话,它可以更明确一些)。