2011-02-03 76 views
1

如下因素构造的std ::向量,构造,对象

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

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

+0

仅供注释:除了每个`push_back()`重新分配向量的内部缓冲区之外。构造一个传递元素个数的vector,缓冲区被分配一次。 – 2011-02-03 22:31:00

回答

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

的这种行为取决于哪一个版本的C++标准你的标准库实现实现的:

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

  • 在C++ 0x中,此缺省构造函数为Object s。

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


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

这将创建具有n个空Object*,它出现一个vector。由于Object*不是类类型,也没有构造函数,所以新插入的对象是初始化的值,对于指针来说,它们被设置为NULL

如果要动态创建新对象,然后将指针存储在容器中,则需要自行拨打new。请注意,如果容器拥有指向对象,则不应将原始指针存储在标准库容器中。这样做并不是特例安全。

您应该使用智能指针像shared_ptrunique_ptr代替(注:auto_ptr智能指针不能被储存在容器中,由于其不寻常的拷贝语义,从而shared_ptrunique_ptr应使用)。

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

+0

一个很重要的例子是struct dumb {int i;愚蠢(){静态INT J = 0; i = j ++; }}; int main(void){std :: vector v(2); std :: cout << v [1] .i << std :: endl; }`这将在C++ 03中打印0,而在C++ 0x中打印1。 – 2011-02-03 22:37:31

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,虽然)。

+0

对于`ptr_vector`和`auto_ptr`备注+1。 – 2011-02-03 22:32:08

0

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

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

+0

`vector`根本不会做任何分配,指针会被初始化为空值。 – 2011-02-03 22:31:41

0

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

当您完成这些对象时,您还需要使用delete这些对象中的每一个。