C ++:为什么boost :: ptr_vector resize需要对象具有默认构造函数

时间:2012-11-14 16:51:20

标签: c++ pointers boost vector ptr-vector

我在std :: vector上使用boost :: ptr_vector,因为它将为我处理所有指针的删除。但是,当我这样做时:

ptr_vector<SoftLabelRandomTreeFunctor> functors;
functors.resize(number_of_functors);

它抱怨SoftLabelRandomTreeFunctor没有默认构造函数。但是,我的印象是,它只需要调整大小以适应number_of_functors *指向SoftLabelRandomTreeFunctor的指针大小,而不是number_of_functors *大小SoftLabelRandomTreeFunctor 1}}本身?

2 个答案:

答案 0 :(得分:3)

我对Boost并不是很有经验,所以请耐心等待我的回答。但是,浏览boost::ptr_vector的文档让我觉得你想要的东西(从问题的评论中如下)应该可以这样做:

boost::ptr_vector< boost::nullable<SoftLabelRandomTreeFunctor> > functors;
functors.resize(number_of_functors, 0);

参考资料供您阅读并做出自己的结论:

答案 1 :(得分:1)

当您编写functors.resize(number_of_functors)时,您可能会增加向量的大小以包含number_of_functors个元素。由于ptr_vector默认情况下不允许存储NULL值,因此需要将有意义的数据放入膨胀的数组中。该函数打算为每个新元素调用new SoftLabelRandomTreeFunctor(),它需要一个默认的构造函数。

如果您想允许NULL,则需要Alexey Kukanov回答建议的boost::nullable,以及手册中包含的教程((here))。

但是,如果您只是打算为number_of_functors元素保留足够的内存而不在语义上创建它们而不增加数组大小 - 您不需要nullable,而应该调用:< / p>

functors.reserve(number_of_functors)

请注意,在此之后,您仍需要在添加新元素时增加数组大小(例如,通过push_back)。只要您的尺寸不超过push_backnumber_of_functors就不会调用内存重新分配,您将获得保证。