C ++中的多重映射

时间:2011-04-26 15:48:42

标签: 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;
}

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

2 个答案:

答案 0 :(得分:5)

{
 mm m_map1; 
 map1[23] = &m_map1;
 mm_map_pointer = &m_map1;
} // end of scope

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

答案 1 :(得分:5)

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

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

  • 我首选的方法是将multimap直接存储在map中(即不使用指针)。作为奖励,这可以简化您的代码 lot

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

    就是这样!

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