繁体   English   中英

std :: vector,构造函数,对象

[英]std::vector, constructors, objects

下列构造函数

 std::vector<Object> objects(n);

创建n个调用默认构造函数的对象,即类似这样的对象:

std::vector <Object> objects;
for (unsigned int i = 0; i < n; i++) objects.push_back(o);

此过程对动态分配的对象也有效吗? 请问施工

std::vector<Object *> objects(n);

代表这个功能?

std::vector <Object*> objects;
for (unsigned int i = 0; i < n; i++) objects.push_back(new Object());

如果没有,有没有办法安排它?

std::vector<Object> objects(n); 

其行为取决于您的标准库实现实现的C ++ Standard版本:

  • 在C ++ 03中,这将创建一个默认的构造Object ,然后复制该对象n次。

  • 在C ++ 0x中,此默认值构造n个Object

区别通常并不重要,但是很高兴知道。


std::vector<Object *> objects(n);  

这将创建一个vector其中包含n个null Object* 由于Object*不是类类型并且没有构造函数,因此将对新插入的对象进行值初始化,这对于指针来说意味着将它们设置为NULL

如果要动态创建新对象,然后将指向它们的指针存储在容器中,则需要自己调用new 请注意,如果容器拥有指向对象,则不应将原始指针存储在标准库容器中。 这样做也不例外。

您应该改为使用诸如shared_ptrunique_ptr类的智能指针(注意:由于auto_ptr智能指针由于其不寻常的复制语义而无法存储在容器中,因此应使用shared_ptrunique_ptr )。

无论如何,要将指向n个不同的,动态分配的对象的指针插入到容器中,您需要调用new n次来创建这n个对象。 您的for循环解决方案没有任何问题。

下列构造函数

std::vector<Object> objects(n);

创建n个调用默认构造函数的对象

是的,但是默认构造函数仅用于构造vector的构造函数的第二个可选参数,通过复制此参数来构造vector中的n对象。 [C ++ 03答案]

如果您做了类似的事情:

std::vector<Object*> objects(n, new Object());

您将动态分配一个对象,并在vector具有指向该对象的n指针,这可能不是您想要的。

如果指针容器应该拥有动态分配的对象,那么使用指针容器几乎总是一个坏主意。 您应该考虑使用boost::ptr_vector类的东西,或者,如果不可能的话,可以使用智能指针的容器(尽管不是std::auto_ptr )。

您的最终代码示例具有正确的总体思路,但请谨慎行事:如果您这样做, vector无法为您管理分配! objects.clear()将泄漏内存。

您可能想使用std::vector<some_smart_ptr<Object> > ,但是选择正确的智能指针类需要注意(例如)将元素从一个向量复制到另一个向量时会发生什么。 boost::shared_ptr是一个安全的选择,但对于您的用例而言可能会有不必要的开销。 boost::ptr_vector可能更好。

不, vector不会自动使用指向Object实例的指针来创建。 您必须执行您编写的for循环才能正确填充它。

完成这些对象后,您还需要delete每个对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM