1

助けてください!。同じキーを持つ c++ の multimap 内のすべての要素を合計する方法。次のマルチマップがあります。

multimap <string,int> mymap;

特定の文字列のすべての値を合計したい。任意のアプローチをいただければ幸いです。

4

2 に答える 2

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

以下も参照してください。

于 2013-01-03T15:41:24.697 に答える
0

マップは最初と2番目のイテレータを提供し、それを合計したいだけなので、累積関数はそのようには機能しません->秒。独自の sum 関数を作成し、それを accumlute に渡す必要があります。これについてはすでにトピックがあります。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 の回答を参照してください。しかし、あなたの質問を考えると、これはやり過ぎかもしれません。

于 2013-01-03T15:13:31.690 に答える