【发布时间】:2012-11-14 16:51:20
【问题描述】:
我在 std::vector 上使用 boost::ptr_vector,因为它将为我处理所有指针的删除。但是,当我这样做时:
ptr_vector<SoftLabelRandomTreeFunctor> functors;
functors.resize(number_of_functors);
它抱怨SoftLabelRandomTreeFunctor 没有默认构造函数。然而,我的印象是它只需要调整到足够大以适应number_of_functors * 指向SoftLabelRandomTreeFunctor 的指针的大小,而不是number_of_functors * 的大小SoftLabelRandomTreeFunctor 本身?
【问题讨论】:
-
当你增加大小时,新的指针被添加到向量中并用新对象的地址初始化。
-
关键是如果你不想在里面放任何东西,那么调整容器大小是没有意义的。如果您知道要要插入一些元素,则可以使用
reserve预分配内存。 -
@KerrekSB 我调整大小的原因是因为我希望能够以随机方式分配给向量,即设置位置 1,然后设置 0。所以 functors.replace(1,obj1) ; functors.replace(0,obj2);所以我调整大小以确保我不会越界
-
@Aly:你不能用
push_backs 代替吗?或者使用不同的容器,比如std::vector<std::unique_ptr<T>>,这似乎更适合你想做的事情。boost::ptr_vector是一个非常具体的容器,适用于非常具体的用例,这似乎不适合你的情况。由于您明确想要指针,因此您应该在可见设计中拥有指针。 -
@KerrekSB push_back 进行顺序插入,即第一次调用会将项目放在位置 0,第二次调用会将其放在位置 1。我想先分配到位置 1,然后再分配到位置 0(如您可以使用固定大小的数组)
标签: c++ pointers boost vector ptr-vector