我无法编译这个相当简单的代码。我收到错误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;
}
答案 0 :(得分:3)
对于std :: map类型的容器,您不能以简单形式使用algorithm std :: accuulate。您需要将算法与二进制操作一起使用,并可能使用lambda表达式作为二进制操作。 例如
int sum = accumulate( m.begin(), m.end(), 0,
[]( int acc, std::pair<int, int> p ) { return ( acc + p.second ); } );
答案 1 :(得分: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;
});
答案 2 :(得分:1)
std::map<K,V>
的元素类型为std::pair<const K,V>
,其中未定义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; });