C++中的多重映射

lea*_*ner 1 c++ pointers map multimap

我想在C++中使用multimaps.主要目的是存在一个存储多图指针的地图.

现在,当我尝试插入多图时,我遇到了问题.有人能告诉我哪里出错了.

typedef multimap<int,int> mm;
typedef map<int,mm*> v_map;

int main()
{
v_map map1;

v_map::iterator it;
it = map1.find(23);

mm *mm_map_pointer;

if( it == map1.end())
  {
   mm m_map1; 
   map1[23] = &m_map1;
   mm_map_pointer = &m_map1;
  }
else
 {
   mm_map_pointer = it->second; 
 }

mm_map_pointer->insert( pair<int, int>(1, 2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题出在mm_map_pointer-> insert(pair(1,2)); 有人可以帮忙吗?

Ben*_*igt 5

{
 mm m_map1; 
 map1[23] = &m_map1;
 mm_map_pointer = &m_map1;
} // end of scope
Run Code Online (Sandbox Code Playgroud)

你的问题是m_map1超出范围并被销毁,留下一个悬空指针.

  • @ user328560:简单!只需取出`v_map` typedef中的星号即可.;-)(这就是我的答案中提到的"直接存储`multimap`"方法.作为奖励,它还使你的代码大约是其原始大小的五分之一.) (5认同)

Chr*_*ung 5

m_map1是一个局部变量,并且你正试图在你的变量中存储一个指针map.当包含该变量的块退出时,这会导致悬空指针.

您有两种方法可以解决这个问题:

  • 我的优选的方法是存储multimapmap直接(即,不使用指针).作为奖励,这可以简化您的代码很多:

    typedef multimap<int, int> mm;
    typedef map<int, mm> v_map;
    
    v_map map1;
    map1[23].insert(make_pair(1, 2));
    
    Run Code Online (Sandbox Code Playgroud)

    而已!

  • 你的另一个选择是用来new创建一个持久的副本multimap.在这种情况下,您map应该保留一个,shared_ptr<multimap<...> >这样您就不必multimap手动取消分配.