C++ C+中的延迟实例化+;

C++ C+中的延迟实例化+;,c++,C++,我试图在不实例化对象的情况下创建一个变量 在Python中,它将如下所示: graph = mymap[c] if c in mymap else Graph() 所以我基本上会检查我是否已经有了这个图,否则我会创建它。我的理解是,如果我在C++中声明以下,它将调用构造函数,并浪费。 所以我尝试使用指针来避免这种“浪费”: Graph*g; if(graphs.find(c)=graphs.end()){ g=新图(); 图[c]=*g; }否则{ g=&(图[c]); } std::cou

我试图在不实例化对象的情况下创建一个变量

在Python中,它将如下所示:

graph = mymap[c] if c in mymap else Graph() 
所以我基本上会检查我是否已经有了这个图,否则我会创建它。我的理解是,如果我在C++中声明以下,它将调用构造函数,并浪费。 所以我尝试使用指针来避免这种“浪费”:

Graph*g;
if(graphs.find(c)=graphs.end()){
g=新图();
图[c]=*g;
}否则{
g=&(图[c]);
}

std::cout你实际上不必在这里做任何花哨的事情。你可以简单地做

Graph* g = &graphs[c];
原因是它具有以下行为:

返回对映射到与键等效的键的值的引用,如果该键不存在,则执行插入


因此,如果键已经有关联的值,您将获得对该对象的引用。如果该键尚不存在,则会为您默认构造并插入一个值,并返回对该新对象的引用。

您实际上不必在此处执行任何操作。你可以简单地做

Graph* g = &graphs[c];
原因是它具有以下行为:

返回对映射到与键等效的键的值的引用,如果该键不存在,则执行插入


因此,如果键已经有关联的值,您将获得对该对象的引用。如果该键尚不存在,将为您默认构造并插入一个值,并返回对该新对象的引用。

另一个答案已经说明了正确的方法来执行您的请求,但我将说明(哈!)地址不匹配的原因:

在这一行:

    graphs[c] = *g;
您正在创建一个您刚刚用
new
创建的图形副本,该副本指向
g
,并且该副本具有不同的地址。然后打印原件和复印件的地址,显然它们在不同的地址

graphs[c] = ...

当没有一个图形对象映射到
c
时(您已经检查了该对象),此代码已经分配和构造了一个(默认)图形对象,该对象将存储在映射中。。之后的赋值只会使它刚刚创建的图形对象看起来像您之前通过调用
new

创建的图形对象。另一个答案已经说明了正确的方法来执行您的请求,但我将解决(哈!)地址不匹配的原因:

在这一行:

    graphs[c] = *g;
您正在创建一个您刚刚用
new
创建的图形副本,该副本指向
g
,并且该副本具有不同的地址。然后打印原件和复印件的地址,显然它们在不同的地址

graphs[c] = ...

当没有一个图形对象映射到
c
时(您已经检查了该对象),此代码已经分配和构造了一个(默认)图形对象,该对象将存储在映射中。。之后的赋值只会使它刚刚创建的图形对象看起来像之前通过调用
new

Maps创建的图形对象。您正在分配一个对象,然后取消对该对象的引用并将其复制到地图中,从而泄漏分配。基本上没有做你认为它能做的事情。你能完成这个例子吗,展示
c
图形的类型(后者可能是
std::map
std::unordered_map
)?有更好的解决方案,如1+答案中所述,但要澄清:
图形[c]=*g
没有做你认为应该做的事。地图已经做了。你正在分配一个对象,然后取消引用并将其复制到地图中,泄露了分配。基本上没有做你认为它应该做的事。你能完成这个例子,显示
c
图形的类型吗(后者可能是一个
std::map
std::unordered\u map
?有更好的解决方案,详见1+答案,但要澄清:
graphs[c]=*g
并没有做你认为它是做的事情。更好的是,它可能只是Graph&g=graphs[c],其中Graph调用Graph的默认构造函数,不需要内存管理。这正是我的答案所说的,唯一的区别是返回引用还是指针,分配和构造与您在注释中演示的完全相同是的,我明白了,我只是对点做了注释你的建议提供了额外的细节,因为OP的问题中的代码是泄漏的…我能不能只做
Graph g=graphs[c];
?这是否等同于Python代码?我开始使用指针,因为我认为这是唯一的方法。
Graph g=graphs[c];
会复制。可能不是你想要的。更好的是,它可能只是图形&g=graphs[c],其中Graph调用Graph的默认构造函数,不需要内存管理。这正是我的答案所说的,唯一的区别是返回引用还是指针,分配和构造与您在注释中演示的完全相同是的,我明白了,我只是对点做了注释你的建议提供了额外的细节,因为OP的问题中的代码是泄漏的…我能不能只做
Graph g=graphs[c];
?这是否等同于Python代码?我开始使用指针,因为我认为这是唯一的方法。
Graph g=graphs[c];
会复制。可能不是你想要的。