Удалить повторяющийся ключ в мультикарте

У меня есть мультикарта:

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, но сразу печатаю элемент. Я хотел бы напечатать все ключи и значения. Мне нужно автоматизировать это, потому что карта большая. Если я повторяю, используя итератор для именMultiMap1, я печатаю ключи повторения.


person user1871217    schedule 04.12.2012    source источник
comment
Мое предположение состояло в том, чтобы сначала выполнить итерацию на my.map-›, сравнивая равные ключи и для тех же ключей помещать значение в набор множества. Но на данный момент это не сработало.   -  person user1871217    schedule 04.12.2012
comment
Покажите код, посмотрим что не так   -  person piokuc    schedule 04.12.2012
comment
Пожалуйста, отредактируйте код вверху.   -  person user1871217    schedule 04.12.2012
comment
Название вопроса подразумевает, что вы хотите удалить элементы из структуры данных, но текст вопроса касается форматирования структуры данных как читаемого текста определенным образом. Возможно, вам стоит пересмотреть название.   -  person Pedro Lamarão    schedule 04.12.2012


Ответы (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,
person piokuc    schedule 04.12.2012
comment
Спасибо за помощь. Хорошего дня. - person user1871217; 05.12.2012
comment
Пожалуйста. Я был бы признателен, если бы вы могли закрыть вопрос - только если это решит вашу проблему, конечно. - person piokuc; 05.12.2012
comment
Извините piokuc, а как мне закрыть вопрос? - person user1871217; 05.12.2012
comment
@@user1871217 вам просто нужно отметить ответ как правильный. большая галочка сбоку от ответа должна быть зеленой. - person piokuc; 05.12.2012