12

の 3 引数形式はlist::splice()、1 つの要素を 1 つのリストから別のリストに移動します。 SGI のドキュメントには、移動中の要素を指すものを含め、すべての反復子が有効なままであると明示的に記載されています。 Roguewave のドキュメントには、メソッドのイテレータ無効化プロパティについては何も記載されていませんsplice()が、C++ 標準では、すべてのイテレータと結合される要素への参照を無効にすることが明示的に述べられています。

splicing() は実際には SGI の定義どおりに動作しますが、Microsoft の STL 実装 (標準の文字に厳密に従う) のデバッグ / セキュア SCL バージョンでアサーション エラー (無効なイテレータの逆参照) が発生します。

今、リストを使用しているのは、それを指している反復子の有効性を維持しながら、リスト間で要素を移動したいからです。この標準は、元の SGI の仕様に対して非常に役に立たない変更を加えました。

この問題を回避するにはどうすればよいですか? または、実用的で頭を砂に突き刺す必要があります(スプライシングは実際にはイテレーターを無効にしないためです-イテレーターのデバッグがオフになると、MSの実装でもそうではありません)。

4

3 に答える 3

11

これこのリンクによると、これは標準の欠陥のようです。新しいライブラリのバージョンで修正されるため、「砂に頭を突っ込む」ことは良い戦略のようです。

于 2008-09-27T07:05:05.643 に答える
2

問題は、反復子がまだ移動された要素を指している場合、以前に「移動された」反復子に関連付けられていた「終了」反復子が変更されていることです。複雑なループを作成しない限り、これは実際には悪いことです。特に、他の開発者が理解するのがより困難になるためです。

私の意見では、より良い方法は、移動したイテレータの前後の要素を指すイテレータを使用することです。

于 2008-09-27T07:10:29.920 に答える
0

リスト (要素の等価クラス) の配列があり、スプライスを使用してリスト間で要素を移動しています。リスト内の任意の要素に直接アクセスし、それを別のリストに移動するためのイテレータの追加配列があります。同時に検索および変更されるリストはありません。スプライス後に要素イテレータを再初期化することもできましたが、それはちょっと醜いです..当面はそれを行うと思います.

于 2008-09-27T10:55:16.293 に答える