21

連続していない STL コンテナー (考慮に入れることもできboost::unordered_mapますboost::multi_index_container) が与えられた場合、要素が削除されない場合 (ただし、新しい要素を追加することはできます)、コンテナー内の要素のメモリ アドレスが変更されないことが保証されますか?

例えば

class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());

言い換えれば、から削除しないと、実行中ずっとabc_ptr指されます。abcabcabc_list

クラスABCを C++/Cli でラップするのでABC、ラッパー クラスのインスタンスへのポインターが必要なので、これを求めています。ABC は単純なクラスであり、コンテナーでメモリを処理する必要があります。答えが「いいえ」の場合は、 を使用しますstd::list<ABC*>

4

4 に答える 4

30

std::liststd::set、およびstd::map新しい要素が追加されたり削除されたりしても、反復子 (単純なポインターを含む) が無効にされないことを保証します。

于 2011-03-03T14:42:27.860 に答える
5

Armenが述べたように、std :: list、std :: set、およびstd :: mapは、削除されたイテレータのみを無効にすることが保証されています。boost :: unodered_mapの場合、修飾子は実際にイテレーターを無効にする可能性があります。

http://www.boost.org/doc/libs/1_38_0/doc/html/boost/unordered_map.html

于 2011-03-03T14:57:22.223 に答える
-1

std::list <shared_ptr <ABC> >ポインターを渡す代わりに使用する方が良いと思います。メモリ管理を委任することをお勧めします (scott meyers effective c++ を参照)。

これには複数の利点があります。

  • それらを解放するという頭痛の種なしに、それらを共有して渡すことができます
  • ポインタのガベージ コレクション
  • そもそもポインタを渡さない
于 2011-03-03T14:42:06.223 に答える