C++:为什么 boost::p tr_vector 调整大小需要对象具有默认构造函数

C++: why boost::ptr_vector resize needs object to have default constructor

本文关键字:对象 构造函数 默认 调整 boost 为什么 tr C++ vector      更新时间:2023-10-16

我正在使用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_functorspush_back就不会调用内存重新分配。