C++:为什么 boost::p tr_vector 调整大小需要对象具有默认构造函数
C++: why boost::ptr_vector resize needs object to have default constructor
我正在使用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
就不会调用内存重新分配。
- 类中的 Arduino 对象构造函数设置垃圾值
- 编译错误:临时对象构造函数中缺少参数
- 双指针在使用 new 时不调用对象构造函数
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- GCC __attribute__((constructor)) 在对象构造函数之前调用
- 自定义对象构造函数在循环外部循环
- 从全局对象构造函数停止监视器计时器
- Arduino 上的 Sketch 停止在对象构造函数中执行
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 为什么当对象构造函数投入新表达式时,为什么不调用DealLocation函数
- 临时结构对象构造函数奇数调用
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 为什么 Clang++ 不在另一个静态库中运行全局对象构造函数?
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 为什么我们需要一个用户提供的const对象构造函数
- 对象构造函数的C++数组
- 将子结构值设置为对象构造函数中安全的纯虚拟函数返回的值
- C等价于新对象(构造函数)
- C++:直接在参数列表中使用数组文字的对象构造函数