2012-12-04 121 views
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 associeted的值,但我一次打印元素。 我想打印所有的键和值。我需要自动化,因为地图很大。 如果我使用迭代器为namesMultiMap1 a迭代打印重复键。

+0

我的猜测是迭代的my.map->第一,比较等号键,以及相同的键把价值一组一组的。但目前这没有奏效。 – user1871217

+0

显示代码,我们将看到有什么问题 – piokuc

+0

请在上方编辑代码。 – user1871217

回答

1

好的,这可以做到如下。注意,结果的类型是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, 
+0

感谢您的帮助。祝你今天愉快。 – user1871217

+0

不客气。如果你能解决问题,我将不胜感激 - 当然,只有当它解决了你的问题。 – piokuc

+1

@ user1871217如果你喜欢这个答案,你为什么不喜欢它? – Rapptz