c++ - 違い - stl:: multimap-データのグループを取得するには?




unordered_multimap 使い方 (4)

すでにキーが分かっている場合は、 multimap::equal_rangeを使ってイテレータをグループの先頭と最後に取得できます。 任意の標準アルゴリズムを使用して、範囲から望ましい結果を得ることができます。 キーがわからない場合は、 begin()begin() 、自分で繰り返してキーを比較して、新しいグループごとに開始点を見つけることができます。

マルチマップには基本的にキーでソートされたデータのグループがあります。 私は、これらの個々のグループにアクセスして集計値を得る方法が必要です。 たとえば、 std::multimap< string, int > I store

{"Group1", 1}, 
{"Group1", 2}, 
{"Group1", 3}, 

{"Group2", 10}, 
{"Group2", 11}, 
{"Group2", 12}

これらの値を保存したら、このマルチマップを繰り返し、各 "グループ"の集計値を取得できるはずです。 問題は、このような方法でMultiMapsにアクセスするためのSTLで定義された関数がないことです。 私はlower_boundupper_boundを使って、手動でマルチマップを繰り返し、グループの内容を合計することができましたが、すでにSTLで定義されているより良い方法があると思っていますか? 上記の例では、グループの集計値をどのように得ることができるか、誰にでも解決策を提案できますか?


マルチマップの回答ではありませんが、あなたが選択した場合は、次のようなことができます。

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <boost/assign/list_of.hpp>
#include <boost/foreach.hpp>
using namespace std;
using namespace boost;
using namespace boost::assign;

int main() {
    typedef map<string, vector<int> > collection;
    collection m;
    m["Group 1"] = list_of(1)(2)(3);
    m["Group 2"] = list_of(10)(11)(12);
    collection::iterator g2 = m.find("Group 2");
    if (g2 != m.end()) {
        BOOST_FOREACH(int& i, g2->second) {
            cout << i << "\n";
        }
    }
}

// samekey.cpp -- Process groups with identical keys in a multimap

#include <iostream>
#include <string>
#include <map>
using namespace std;

typedef multimap<string, int> StringToIntMap;
typedef StringToIntMap::iterator mapIter;

int main ()
{
    StringToIntMap mymap;

    mymap.insert(make_pair("Group2", 11));
    mymap.insert(make_pair("Group1",  3));
    mymap.insert(make_pair("Group2", 10));
    mymap.insert(make_pair("Group1",  1));
    mymap.insert(make_pair("Group2", 12));
    mymap.insert(make_pair("Group1",  2));

    cout << "mymap contains:" << endl;

    mapIter m_it, s_it;

    for (m_it = mymap.begin();  m_it != mymap.end();  m_it = s_it)
    {
        string theKey = (*m_it).first;

        cout << endl;
        cout << "  key = '" << theKey << "'" << endl;

        pair<mapIter, mapIter> keyRange = mymap.equal_range(theKey);

        // Iterate over all map elements with key == theKey

        for (s_it = keyRange.first;  s_it != keyRange.second;  ++s_it)
        {
           cout << "    value = " << (*s_it).second << endl;
        }
    }

    return 0;

}   //  end main

// end samekey.cpp

equal_range
Syntax:     
#include <map>
pair<iterator, iterator> equal_range( const key_type& key );
The function equal_range() returns two iterators - one to the first 
element that contains key, another to a point just after the last
element that contains key. 




multimap