代码之家  ›  专栏  ›  技术社区  ›  Frank

我应该使用boost::ptr_vector<t>还是vector<boost::shared_ptr<t>>?

  •  17
  • Frank  · 技术社区  · 14 年前

    我需要一容器指针。你能推荐吗 boost::ptr_vector<T> std::vector<boost::shared_ptr<T> > ?(或者其他什么?)

    如果您感兴趣,我的实际数据结构相对复杂(请参见 here )当前存储的是对象,而不是指针,但我想更改它(使用指针容器),以便消除不必要的复制:

    typedef std::multimap<Foo0, std::map<int, double> > VecElem;
    std::vector<VecElem> vec;
    
    2 回复  |  直到 9 年前
        1
  •  31
  •   Björn Pollex    10 年前

    谁拥有这个物品? 如果容器拥有对象(意味着对象的寿命不应长于容器),请使用 ptr_vector . 否则,使用向量 shared_ptr S.标准库容器(例如 std::vector std::list )拥有它们包含的对象,因此 ptr_矢量 更接近这一点。

        2
  •  14
  •   sbi    9 年前

    shared_ptr<> 确实有一个共享的所有者语义,它是通过增加和减少引用计数来实现的。这会带来一些开销,特别是当启用多线程时(因为这些计数器随后必须被锁定)。

    如果对象是共享的,请使用 共享资源
    但是,如果它们被容器有效地拥有,并且应该随容器一起消失,并且当容器消失时,发出的引用(指针)也可能消失,那么使用指针容器,因为它们的开销更少。
    如果您不确定,请使用 shared_ptr 为了安全起见。如果结果表明您有性能问题,您可以稍后进行优化。(优化工作系统比过早优化系统更容易。)