1

次のコードを検討してください。

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<>ます。私の要件は基本的に次のとおりです。

  • コンテナの一部であるオブジェクトの範囲の同じインスタンスを別のコンテナ インスタンスで共有する
  • これら 2 つ以上のコンテナーで 1 つのインスタンスを共有したくない
  • 1 つの要素が他のコンテナーから「突然」消去されたときに通知を受け取りたい (または、少なくともこれを確認してください。たとえば、 のようなものですshared_ptr::unique()) 。

両方のコンテナーは同じクラスの一部です。したがって、それらは同じスコープを持ち、同時に破棄されます。これらのクラスのコンストラクターは、両方のコンテナーを構築します。建設後、これらのコンテナに変更はありません。

std::vector<>代わりにofを使用する必要shared_ptr<>がありますか、それとも他の解決策はありますか?

4

1 に答える 1

3

はい、使用する必要がありますvector<shared_ptr<int>>

範囲のみを扱っているため、範囲とその交差を追跡するカスタム ソリューションをまとめることができます (を実装するためunique)。次に、すべてをベクトルに格納し、範囲にインデックスを付けることができます。これはおそらく (キャッシュ ミスが回避されるという理由だけで) 高速になりますが、実装にはより多くの作業が必要になります。

于 2011-06-17T18:32:26.173 に答える