std :: vector push_back(Object())和push_back(new Object())的区别?

时间:2013-01-05 19:39:21

标签: c++ vector insert std

在我当前的代码中,我想将新的DrawObjects插入到我创建的向量中,

的std ::矢量< DrawObject>对象;

有什么区别:

objects.push_back(DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber));

objects.push_back(new DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber));

4 个答案:

答案 0 :(得分:16)

第一个添加非指针对象,而第二个添加指针到向量。所以这一切都取决于向量的声明,你应该做哪一个。

在您的情况下,由于您已将objects声明为std::vector<DrawObject>,因此第一个将起作用,因为objects可以存储DrawObject类型的项目,而不是{{ 1}}。

在C ++ 11中,您可以将DrawObject*用作:

emplace_back

注意区别。将其与:

进行比较
objects.emplace_back(name, surfaceFile, xPos, yPos, 
                     willMoveVar, animationNumber);

使用objects.push_back(DrawObject(name, surfaceFile, xPos, yPos, willMoveVar, animationNumber)); ,您不在调用站点构造对象,而是将参数传递给vector,并且向量在内部构造对象。在某些情况下,这可能会更快。

阅读有关emplace_back的文档(强调我的),

  

将新元素追加到容器的末尾。该元素就地构建,即不执行复制或移动操作。使用提供给函数的完全相同的参数调用元素的构造函数。

由于它避免了复制移动,因此生成的代码可能会更快一些。

答案 1 :(得分:1)

鉴于

std::vector< DrawObject > objects;

两个版本之间的区别在于第一个版本是正确的,第二个版本不是。

如果第二个版本编译,正如您在评论中指出的那样,它不会按预期执行。它还建议您考虑制作一些DrawObject的构造函数explicit

答案 2 :(得分:1)

第二个版本希望objects是DrawObject的指针的向量,而第一个版本希望objects保持对象本身。因此,根据objects的声明,只会编译其中一个版本。

如果以你的方式声明objects,只有第一个版本会编译,如果你将对象声明为std::vector< DrawObject*> objects;,那么只会编译第二个版本。

答案 3 :(得分:0)

使用关键字new创建对象时,将其分配到堆上。这将返回指向对象的指针。

当您创建没有关键字new的对象时,它将在堆栈上分配,您将可以访问该对象。