c++ - 删除 multimap 中的重复键

标签 c++ stl key duplicates multimap

我有一个 multimap :

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 相关联的值,但我一次打印了一个元素。 我想打印所有键和值。我需要自动化,因为 map 很大。 如果我使用 namesMultiMap1 的迭代器进行迭代,则打印重复键。

最佳答案

好的,这可以像下面这样完成。注意,结果的类型是 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,

关于c++ - 删除 multimap 中的重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707521/

相关文章:

c++ - 在 STL 容器的一个 STL 容器上调用 clear

vim - 在Vim中按缩进线按“Home”

typescript - 如何从 TypeScript 中的 web.config 获取 key ?

ios - 在 Info.plist 中为通用应用程序设置 Main nib?

c++ - 我应该有一个分配器作为我的类中的成员变量吗?

c++ - 如何在QT中的QToolButton下方设置文本而不是在图标下方

c++ - 为什么在核心转储中得到 "first/second chance not available"

c++ - 获取有向图中2个节点之间的所有路径

c++ - 为什么 c++ 中的分配器为 void 类型提供专门化

c++ - Windows 上的 std::basic_string<TCHAR> 会优于 std::wstring 吗?