C++; 我尝试在C++中使用MultuMAP。主要目的是有一个存储多重映射指针的映射

C++; 我尝试在C++中使用MultuMAP。主要目的是有一个存储多重映射指针的映射,c++,pointers,map,multimap,C++,Pointers,Map,Multimap,现在,当我尝试插入到多重贴图时,我遇到了问题。谁能告诉我哪里出了问题 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] = &

现在,当我尝试插入到多重贴图时,我遇到了问题。谁能告诉我哪里出了问题

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;
}
typedef多重映射mm;
typedef映射v_映射;
int main()
{
v_图map1;
v_map::迭代器it;
it=map1.find(23);
mm*mm_映射_指针;
if(it==map1.end())
{
mm_map1;
map1[23]=&m_map1;
mm_map_指针=&m_map1;
}
其他的
{
mm_map_pointer=it->second;
}
mm_映射_指针->插入(对(1,2));
返回0;
}
问题在于mm_映射_指针->插入(对(1,2)); 有人能帮忙吗

{
 mm m_map1; 
 map1[23] = &m_map1;
 mm_map_pointer = &m_map1;
} // end of scope
您的问题是
m_map1
超出范围并被破坏,留下一个悬空的指针


您的问题是
m_-map1
超出范围并被破坏,留下一个悬空的指针。

您的
m_-map1
是一个局部变量,您试图在
映射中存储指向该变量的指针。当包含该变量的块退出时,这将导致指针悬空

有两种方法可以解决此问题:

  • 我的首选方法是直接将
    多映射
    存储在
    映射
    中(即不使用指针)。作为奖励,这大大简化了您的代码:

    typedef多重映射mm;
    typedef映射v_映射;
    v_图map1;
    map1[23]。插入(make_pair(1,2));
    
    就这样

  • 您的另一个选项是使用
    new
    创建
    multimap
    的持久副本。在这种情况下,您的
    map
    应该持有
    shared_ptr
    ,这样您就不必手动取消分配
    multimap


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

有两种方法可以解决此问题:

  • 我的首选方法是直接将
    多映射
    存储在
    映射
    中(即不使用指针)。作为奖励,这大大简化了您的代码:

    typedef多重映射mm;
    typedef映射v_映射;
    v_图map1;
    map1[23]。插入(make_pair(1,2));
    
    就这样

  • 您的另一个选项是使用
    new
    创建
    multimap
    的持久副本。在这种情况下,您的
    map
    应该持有
    shared_ptr
    ,这样您就不必手动取消分配
    multimap


有什么问题?编译器错误?运行时错误?“有人能帮忙吗?”如果这是你的问题,那么答案是否定的,因为你还没有告诉我们你想要解决的问题是什么。你犯了什么错误?当你尝试时会发生什么?您期望会发生什么?编译器错误,在mm_映射_指针->插入(对(1,2));你有什么问题?代码编译并运行正常(添加了
#include;使用名称空间std;
)。您好。。问题是以动态方式插入多重映射。我想把所有这些都放在一个循环中,这样我就可以在需要的时候创建一个新的多重映射。问题是什么?编译器错误?运行时错误?“有人能帮忙吗?”如果这是你的问题,那么答案是否定的,因为你还没有告诉我们你想要解决的问题是什么。你犯了什么错误?当你尝试时会发生什么?您期望会发生什么?编译器错误,在mm_映射_指针->插入(对(1,2));你有什么问题?代码编译并运行正常(添加了
#include;使用名称空间std;
)。您好。。问题是以动态方式插入多重映射。我想把所有这些都放在一个循环中,这样我就可以在需要的时候创建一个新的多重映射。谢谢Ben,你能给我一些建议吗,如何让动态多重映射ie在循环中创建多重映射并在任何地方初始化它。@user328560:Simple!只需取出
v_映射中的星号
typedef.-)(这是我在回答中提到的“直接存储
multimap
”方法。作为奖励,它还使您的代码约为其原始大小的五分之一。)谢谢Ben,您能给我一些建议吗,如何让动态multimap ie在循环中创建multimap并在任何地方初始化它。@user328560:简单!只需取出
v_映射中的星号
typedef.-)(这就是我在回答中提到的“直接存储
multimap
”方法。作为奖励,它还使您的代码大约为原始大小的五分之一。)
typedef multimap<int, int> mm;
typedef map<int, mm> v_map;

v_map map1;
map1[23].insert(make_pair(1, 2));