请帮忙! 如何在具有相同键的c ++中汇总多图中的所有元素。我有以下多图:
multimap <string,int> mymap;
我希望对特定字符串的所有值求和。 任何方法都将不胜感激。
答案 0 :(得分:3)
这样的事可能适合你:
#include <string>
#include <map>
#include <numeric>
#include <functional>
#include <iostream>
struct plus2nd {
template <typename T1, typename T2>
inline T1 operator()(T1 t1, const T2 &t2) const {
return t1 + t2.second;
}
};
template <typename Map, typename Key, typename Value>
Value accumulate_range(const Map & map, const Key & key, Value init)
{
typedef typename Map::const_iterator const_iterator;
typedef typename Map::value_type value_type;
std::pair<const_iterator, const_iterator> range = map.equal_range(key);
return std::accumulate(range.first, range.second, init, plus2nd());
}
int main()
{
std::multimap<std::string, int> mymap;
mymap.insert(std::multimap<std::string, int>::value_type("A", 1));
mymap.insert(std::multimap<std::string, int>::value_type("B", 3));
mymap.insert(std::multimap<std::string, int>::value_type("A", 4));
mymap.insert(std::multimap<std::string, int>::value_type("B", 4));
std::cout << "Sum of A: " << accumulate_range(mymap, "A", 0) << std::endl;
std::cout << "Sum of B: " << accumulate_range(mymap, "B", 0) << std::endl;
}
另见:
答案 1 :(得分:0)
你的累积函数不会以这种方式工作,因为你的地图为迭代器提供了第一个和第二个,你只想总结它 - >第二个。你必须编写自己的sum函数并将其传递给accumlute。已有一个主题描述了这一点,请参阅multimap accumulate values了解Matthieu M的答案。
修改:以下内容可以解决您的问题。
int map_acc(int lhs, const std::pair<std::string, int> & rhs)
{
return lhs + rhs.second;
}
std::pair<std::multimap<std::string,int>::const_iterator, std::multimap<std::string,int>::const_iterator> range = mymap.equal_range("somekey");
int result = std::accumulate(range.first, range.second, 0, &map_acc);
编辑2:如果您想要更通用的方法,请选择Vlad Lazarenko。但考虑到你的问题,这可能有点过头了。