10

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

std::vector<DrawObject> 对象;

有什么区别:

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

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

4 回答 4

18

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

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

在 C++11 中,您可以emplace_back用作:

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

注意区别。将其与:

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

使用emplace_back,您不会在调用点构造对象,而是将参数传递给向量,然后向量在内部就地构造对象。在某些情况下,这可能会更快。

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

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

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

于 2013-01-05T19:42:00.163 回答
1

给定

std::vector< DrawObject > objects;

两个版本的区别在于第一个是正确的,而第二个是错误的。

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

于 2013-01-05T19:41:07.753 回答
1

第二个版本期望objects是一个指向 DrawObject 的指针向量,而第一个版本期望objects持有对象本身。因此,根据objects只有一个版本的声明将编译。

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

于 2013-01-05T19:41:26.163 回答
0

当您使用关键字创建对象时,new您将其分配在堆上。这将返回一个指向该对象的指针。

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

于 2013-01-05T19:41:22.703 回答