1

boost::intrusiveドキュメントに記載されているパフォーマンスとメモリ使用量の保証を維持しながら、同じ要素が異なる侵入型コンテナーに表示される可能性があることをよく理解していません。

ドキュメントには次のように記載されています。

侵入型コンテナは、渡されたオブジェクトのコピーを保存しませんが、オブジェクト自体を保存します。オブジェクトをコンテナーに挿入するために必要な追加データは、オブジェクト自体によって提供される必要があります。たとえばMyClass、リンクされたリストを実装する侵入型コンテナーに挿入するにMyClassは、必要な次および前のポインターを含める必要があります。

class MyClass
{
   MyClass *next;
   MyClass *previous;
   // ...
};

STL と boost::intrusive コンテナーの違いに下線を引くと、ドキュメントには次のようにも記載されています。

非侵入型コンテナにはいくつかの制限があります。

オブジェクトは 1 つのコンテナーにのみ属することができます。2 つのコンテナー間でオブジェクトを共有する場合は、それらのオブジェクトの複数のコピーを格納するか、ポインターのコンテナーを使用する必要があります std::list<Object*>

理にかなっています。要素を 2 つstd::listの s にすることはできません。わかった。MyClassしかし、タイプの 1 つのインスタンスを2 つの異なる に挿入するにはどうすればよいでしょうかboost::intrusive::list。たとえば、そのような要素は次の要素へのポインターを 1 つしか持てず、前の要素へのポインターを 1 つしか持つことができないとします。私が間違っていなければ、これは、あるコンテナーを変更すると他のコンテナーも変更される可能性があると想定している場合にのみ機能し、その逆も同様です。

4

1 に答える 1

0

Boost.Intrusive ライブラリでは、andポインターを定義するように文字通り求められることありません。ドキュメントのその部分では、andポインターの存在は、侵入コンテナーがどのように機能するかの概念図にすぎません。prevnextprevnext

prev侵入型コンテナーを定義する実際の方法は、継承を介して、またはおよびnextポインターを含むメンバーとしてフックを含めることです。複数のフック (異なる静的タイプでタグ付け) を含めることにより、同じオブジェクトを複数の異なる侵入型コンテナー (それぞれ異なる静的タイプでタグ付け) に含めることができます。

フックがどのように機能するかについては、http://www.boost.org/doc/libs/1_38_0/doc/html/intrusive/usage.htmlを参照してください。複数の侵入型 contianers でこれを行う方法の例については、この StackOverflow の回答を参照してください。

これにはいくつかの制限があります.実行時に定義された複数の侵入型コンテナの任意のセットにオブジェクトを含めることはできません.最初にコーディングするときにどのコンテナを使用したいかを知り、それぞれの知識を構築する必要があります.あなたのオブジェクトに。

于 2013-03-03T19:10:07.767 に答える