std :: vector,constructors,objects

时间:2011-02-03 22:17:23

标签: c++ pointers stl constructor vector

以下构造函数

 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());

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

4 个答案:

答案 0 :(得分:6)

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

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

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

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

差异通常不重要,但知道很好。


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

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

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

您应该使用类似shared_ptrunique_ptr的智能指针(注意:auto_ptr智能指针由于其不寻常的复制语义而无法存储在容器中,因此{{1应该使用{}}或shared_ptr

在任何情况下,要将指向n个不同的动态分配对象的指针插入容器,您需要调用unique_ptr n次来创建这些n个对象。您的new循环解决方案没有任何问题。

答案 1 :(得分:2)

  

以下构造函数

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

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

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

如果你做了类似的事情:

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

你会动态分配一个对象并在n中拥有vector指向该对象的指针,这可能不是你想要的。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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