【问题标题】:C++: why boost::ptr_vector resize needs object to have default constructorC++:为什么 boost::ptr_vector 调整大小需要对象具有默认构造函数
【发布时间】: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&lt;std::unique_ptr&lt;T&gt;&gt;,这似乎更适合你想做的事情。 boost::ptr_vector 是一个非常具体的容器,适用于非常具体的用例,这似乎不适合你的情况。由于您明确想要指针,因此您应该在可见设计中拥有指针。
  • @KerrekSB push_back 进行顺序插入,即第一次调用会将项目放在位置 0,第二次调用会将其放在位置 1。我想先分配到位置 1,然后再分配到位置 0(如您可以使用固定大小的数组)

标签: c++ pointers boost vector ptr-vector


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    functors.reserve(number_of_functors)

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

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2019-03-01
      • 2012-12-25
      • 2011-06-17
      • 2013-03-20
      相关资源
      最近更新 更多