我正在使用boost::p tr_vector而不是std::vector,因为它将为我处理所有指针的删除。但是,当我这样做时:
ptr_vector<SoftLabelRandomTreeFunctor> functors;
functors.resize(number_of_functors);
它抱怨SoftLabelRandomTreeFunctor
没有默认构造函数。但是,我的印象是,它只需要调整足够大的大小以容纳number_of_functors
*指向SoftLabelRandomTreeFunctor
的指针的大小,而不是number_of_functors
*SoftLabelRandomTreeFunctor
本身的大小?
我对 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 );
- 如果容器支持 null,则to_clone
可以是 0 的备注
当你写functors.resize(number_of_functors)
时,你可能会增加向量的大小,以包含number_of_functors
元素。由于默认情况下ptr_vector
不允许存储NULL
值,因此它需要将有意义的数据放入膨胀数组中。该函数打算为每个新元素调用new SoftLabelRandomTreeFunctor()
,并且需要为此使用默认构造函数。
如果要允许 NULL,则需要 Alexey Kukanov 答案建议的boost::nullable
,以及手册中包含的教程((此处))。
但是,如果您只是打算为number_of_functors
元素保留足够的内存,而不在语义上创建它们并且不增加数组大小---则不需要nullable
,您应该改为调用:
functors.reserve(number_of_functors)
请注意,在此之后,当您放置新元素时(例如通过 push_back
),您仍然需要增加数组大小。您将得到保证,只要您的大小不超过 number_of_functors
,push_back
就不会调用内存重新分配。