C ++在boost :: ptr_container中共享元素?

时间:2011-06-17 18:26:58

标签: c++ boost stl shared-ptr ptr-vector

请考虑以下代码:

int main()
{
    typedef boost::ptr_vector<int> ptr_vector;

    ptr_vector vec0;
    vec0.push_back(new int(1));
    vec0.push_back(new int(2));
    vec0.push_back(new int(3));
    vec0.push_back(new int(4));
    vec0.push_back(new int(5));

    ptr_vector::iterator last  = boost::prior(vec0.end()),
                         first = boost::prior(last, 3);

    ptr_vector vec1(first, last); // this will copy '2, 3, 4' to vec1

    struct print
    {
        void operator()(int const& i) {
            std::cout << i.m_i << std::endl;
        }
    };

    std::for_each(vec0.begin(), vec0.end(), print());   // 1, 2, 3, 4, 5
    std::for_each(vec1.begin(), vec1.end(), print());   // 2, 3, 4

    return 0;
}

我不希望将copy元素转换为vec1,而是以shared_ptr<>提供的方式共享。我的要求主要是:

  • 在另一个容器实例
  • 中共享一系列对象的相同实例,这些对象是容器的一部分
  • 不想在超过这两个容器的情况下共享一个实例
  • 想要在其他容器中“突然”删除一个元素时收到通知(或至少检查一下,例如shared_ptr::unique()

两个容器都属于同一类。因此,它们具有相同的范围并且将同时被销毁。这些类的构造函数构造两个容器。施工后,这些容器不会有任何改动。

我是否需要使用std::vector<>代替shared_ptr<>,还是有其他解决方案?

1 个答案:

答案 0 :(得分:3)

是的,您应该使用vector<shared_ptr<int>>

由于您只使用范围,因此可以组合一个自定义解决方案来跟踪范围及其交叉点(用于实现unique。)然后,您可以将所有内容存储在矢量中并具有范围索引。这可能会更快(仅仅考虑到避免的缓存未命中),但实施起来会更多。