Удалить дубликат ключа в мультикарте

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

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, выведите ключи повторения.

0

Решение

Хорошо, это можно сделать следующим образом. Обратите внимание, что тип результата 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,
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]