0

私はマルチマップを持っています:

std::multimap < string, string >::iterator iter_map;
multimap < string, set<string> > my.map;  

Typical output and data structure:

key        -    value

bird       -    air
bird       -    earth
fish       -    water
lion       -    earth
lion       -    water 

新しいデータが次のようになるように、データ構造を変更したいと思います(印刷するだけではありません)。

bird      -    air, earth
fish      -    water
lion      -    earth, water

他の方法では、重複するキーを削除する方法は?

これは私がしました:

int size_mmap = namesMultiMap1.size();
pair<multimap<string,string>::iterator,multimap<string,string>::iterator> ret;

for (int i = 0; i < 1; i++){

   cout << " xxx "<< " =>";
   ret = namesMultiMap1.equal_range("xxx");

     for (nameItr1=ret.first; nameItr1!=ret.second; ++nameItr1)
     cout << " " << (*nameItr1).second;

}

このようにして、キーxxxに関連付けられた値を印刷しますが、要素を一度に印刷します。すべてのキーと値を印刷したいと思います。地図が大きいので自動化する必要があります。namesMultiMap1にイテレータを使用して反復する場合は、繰り返しキーを出力します。

4

1 に答える 1

2

わかりました、これは次のように行うことができます。結果のタイプは、希望どおりmap<string, set<string> >ではなくmultimap < string, set<string> >、重複したキーが必要ないためmap、より理にかなっていることに注意してください。

#include <map>
#include <set>
#include <string>
#include <iostream>
#include <iterator>

using namespace std;

typedef multimap<string,string> mm; 
typedef map<string, set<string> > ms; 

ms convert(const mm& m)
{   
    ms r;

    for (mm::const_iterator it = m.begin(); it != m.end(); ++it)
    {   
        set<string>& s(r[it->first]);
        s.insert(it->second);
    }   

    return r;
}   


int main()
{   
    mm m;
    m.insert(make_pair("john", "kowalski"));
    m.insert(make_pair("john", "smiths"));
    m.insert(make_pair("mary", "doe"));
    m.insert(make_pair("mary", "walker"));

    ms s(convert(m));

    for (ms::iterator it = s.begin(); it != s.end(); ++it)
    {   
        cout << it->first << ": ";
        set<string> &st(it->second);
        copy(st.begin(), st.end(), ostream_iterator<string>(cout, ", "));
        cout << endl;
    }   
    return 0;
}   

これは印刷されます:

john: kowalski, smiths,
mary: doe, walker,
于 2012-12-04T18:56:02.713 に答える