2012-12-04 260 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