3

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

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

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

4

2 回答 2

3

我对 Boost 并没有真正的经验,所以对我的回答持保留态度。但是,浏览文档boost::ptr_vector让我认为你想要的(从问题的评论如下)应该可以这样做:

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

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

于 2012-11-14T19:10:47.277 回答
1

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

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

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

functors.reserve(number_of_functors)

请注意,在此之后,您仍然需要在放置新元素时增加数组大小(例如 via push_back)。您将得到保证,push_back只要您的大小不超过,就不会调用内存重新分配number_of_functors

于 2013-03-26T16:04:53.310 回答