我在std :: vector上使用boost :: ptr_vector,因为它将为我处理所有指针的删除。但是,当我这样做时:
ptr_vector<SoftLabelRandomTreeFunctor> functors;
functors.resize(number_of_functors);
它抱怨SoftLabelRandomTreeFunctor
没有默认构造函数。但是,我的印象是,它只需要调整大小以适应number_of_functors
*指向SoftLabelRandomTreeFunctor
的指针大小,而不是number_of_functors
*大小SoftLabelRandomTreeFunctor
1}}本身?
答案 0 :(得分:3)
我对Boost并不是很有经验,所以请耐心等待我的回答。但是,浏览boost::ptr_vector
的文档让我觉得你想要的东西(从问题的评论中如下)应该可以这样做:
boost::ptr_vector< boost::nullable<SoftLabelRandomTreeFunctor> > functors;
functors.resize(number_of_functors, 0);
参考资料供您阅读并做出自己的结论:
class nullable
void resize( size_type size, T* to_clone );
- 如果容器支持空值,请注意to_clone
可以为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_back
,number_of_functors
就不会调用内存重新分配,您将获得保证。