【问题标题】:Accumulate on Map累积在地图上
【发布时间】:2014-03-06 01:23:39
【问题描述】:

我无法编译这个相当简单的代码。我收到错误消息could not deduce template argument for 'std::basic_string<_Elem,_Traits,_Alloc> &&' from 'int'。我需要通过一些自定义求和函数来累积吗?或者也许有更简单的方法来获取地图中所有第二个值的总和?谢谢!

#include <iostream>
#include <math.h>
#include <map>
#include <numeric>  


int main()
{

map<int, int> m; 

m[1] = 1;
m[2] = -1;
m[3] = 1;
m[4] = 2;

int sum = accumulate(m.begin(), m.end(), 0);
cout << sum;

return 0;
}

【问题讨论】:

    标签: c++ algorithm dictionary accumulate


    【解决方案1】:

    对于 std::map 类型的容器,您不能使用其简单形式的算法 std::accuulate。您需要将算法与二进制运算一起使用,并可能使用 lambda 表达式作为二进制运算。 例如

    int sum = accumulate( m.begin(), m.end(), 0,
                          []( int acc, std::pair<int, int> p ) { return ( acc + p.second ); } );
    

    【讨论】:

      【解决方案2】:

      std::map&lt;K,V&gt; 的元素类型为 std::pair&lt;const K,V&gt;,未定义 operator+。您需要使用 accumulate 的 4 参数版本并提供您自己的加法操作:

      typedef std::pair<int, int> Pair;
      
      int sum = accumulate(m.begin(), m.end(), 0,
          [](int i, Pair p){ return i + p.second; }); 
      

      【讨论】:

      • 它是 std::pair - 但在这里没关系
      • 亲爱的小伙子,亲爱的小伙子,你是怎么解决的?
      • @Yakk Element type of std::map&lt;K,V&gt; is std::pair&lt;const K,V&gt; 注意 const 以前不存在。如果这不是你的意思,你的意思是什么do? :)
      • 您的代码缺少修复。诚然,它只是复制它,所以伤害很小。
      【解决方案3】:

      std::map&lt;int, int&gt; 包含 std::pair&lt;const int, int&gt; 元素。 std::accumulate 不知道如何处理这些。但是你可以通过传递一个合适的函子来解决这个问题。例如,要累积密钥:

      int fun(int i, const std::pair<const int, int>& rhs)
      {
        return i + rhs.second;
      }
      int sum = accumulate(m.begin(), m.end(), 0, fun);
      

      请注意,如果您不需要在其他任何地方使用 fun,您可以使用 lambda 来简化此操作:

      int sum = accumulate(m.begin(), m.end(),
                           [](int i, const std::pair<const int, int>& rhs)
                           {
                             return i + rhs.second;
                           });
      

      【讨论】:

      • 是 std::pair
      • @jrok 谢谢,我正在解决这个问题。
      • @DieterLücking 对。固定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      相关资源
      最近更新 更多