【问题标题】:How to sum up all the elements in a multimap in c++ having the same key如何在具有相同键的c ++中总结多图中的所有元素
【发布时间】:2013-01-03 14:56:24
【问题描述】:

请帮忙! 如何在具有相同键的 C++ 中总结多图中的所有元素。我有以下多张地图:

multimap <string,int> mymap;

我想对特定字符串的所有值求和。 任何方法都将不胜感激。

【问题讨论】:

  • range = mymap.equal_range(s); int x = 累积(range.first, range.second, 0);
  • 您是否尝试使用简单的for 循环而不是accumulate
  • 问题是地图的迭代器是对的,你只想累积其中的.second部分......
  • 我看不出你所做的有什么问题

标签: c++ multimap


【解决方案1】:

这样的事情可能对你有用:

#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;
}

另见:

【讨论】:

    【解决方案2】:

    你的累积函数不会那样工作,因为你的地图提供了第一个和第二个迭代器,你只想总结它->第二个。您必须编写自己的 sum 函数并将其传递给 accumlute。已经有话题描述了这个,请看multimap accumulate valuesMatthieu 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 的答案。但考虑到你的问题,这可能有点矫枉过正。

    【讨论】:

    • 我猜这应该是对我的回答的评论。我会删除它,因为它显然是错误的。谢谢 - 我没有时间尝试。
    • 但它说 buf_map 尚未声明!!
    • it->first 到 it->second 的范围是正确的。所有使用 stl 范围迭代器对的算法都遵循约定 [first, last)
    • 您必须将 buf_map 替换为您的地图变量的名称。我链接的答案使用与该问题相关的名称:)
    • @arrows accumulate(range.first, range.second, 0); 将尝试总结 (*it) 而 TO 想要总结 (*it)->second。累积只是不适用于开箱即用的多图,因为它不知道您要总结什么。
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多