4

我无法编译这个相当简单的代码。我得到错误,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;
}
4

3 回答 3

6

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

int sum = accumulate( m.begin(), m.end(), 0,
                      []( int acc, std::pair<int, int> p ) { return ( acc + p.second ); } );
于 2014-02-08T15:46:56.740 回答
1

一个std::map<int, int>包含std::pair<const int, int>元素。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;
                     });
于 2014-02-08T15:41:45.273 回答
1

未定义std::map<K,V>的元素类型std::pair<const K,V>operator+您需要使用 4 个参数版本accumulate并提供您自己的加法运算:

typedef std::pair<int, int> Pair;

int sum = accumulate(m.begin(), m.end(), 0,
    [](int i, Pair p){ return i + p.second; }); 
于 2014-02-08T15:45:07.313 回答