STLでは、ほぼすべてのコンテナに消去機能があります。私が持っている質問はベクトルにあり、erase関数はベクトルの次の要素を指すイテレータを返します。マップコンテナはこれを行いません。代わりに、voidを返します。誰にもこの不一致がなぜあるのか知っていますか?STLベクトル対マップ消去
答えて
を参照してくださいhttp://www.sgi.com/tech/stl/Map.html
地図は がマップ に新しい要素を挿入すると、既存の要素に ポイントというイテレータを無効にしないことが重要な特性を持っています。 要素をマップから消去しても、 は、 の反復子を無効にします。反復子の場合、実際には は、 の要素を指しています。
イレーサをイレーザに戻すのは、リストの要素を消去して行くことができるようにするためです。アイテムを消去しても既存のイテレータが無効にならない場合は、これを行う必要はありません。
私はこれが答えかどうか分かりませんが、次の要素の位置付けのコストが原因である可能性があります。マップを反復することは、本質的に「遅い」ことです。
この不一致は、使用に起因するものです。 vector
は、要素上で順序付けを行うシーケンスです。 map
の要素もいくつかの比較基準に従って順序付けされているのは事実ですが、この順序は構造からは明らかではありません。ある要素から次の要素に至る効率的な方法はありません(効率=一定時間)。実際、マップ上で反復するのは非常に高価です。イテレータまたはイテレータ自体の作成には、完全なツリーを散策する必要があります。これは、スタックが使用されている場合を除き、(n)で実行することはできません。この場合、必要なスペースはもはや一定ではありません。
すべての場合、消去後に「次の」要素を戻す安価な方法はありません。シーケンスの場合、はです。
さらに、Robが適切です。マップがイテレータを返す必要はありません。
MS Visual Studio C++(Dinkumware IIRC)に同梱されているSTLは、イテレータを次の要素に返すerase
関数を持つマップ実装を提供します。
標準に準拠していないことに注意してください。
erase
は、C++ 11でiterator
を返します。これはdefect report 130のためです:
表67(23.1.1)は、container :: erase(iterator)がイテレータを返すことを示しています。表69(23.1.2)では、この要件に加えて、container :: erase(iterator)がvoidを返すとも言っています。これは追加ではありません。これは、コンテナの要件を満たすことができない連想型コンテナを作成するという要件を変更したものです。LWGは、戻り値の型は、イテレータではなく、無効であるべき同意
:
標準化委員会がこれを受け入れました。 (Alex Stepanovも同意する)。
(LWG = Library Working Group)。
- 1. のstd ::ベクトル::対消去「スワップとポップ」
- 2. STLベクトルの偶数インデックスの重複要素を消去する
- 3. マップ消去エラー
- 4. ポインタによるSTLベクタ消去
- 5. C++消去ベクトル要素
- 6. STD関数消去::ベクトル
- 7. 消去を使ってベクトルから要素を消去する
- 8. STLマップとベクトルのIteratorアクセスパフォーマンスは?
- 9. STDベクトルの消去や一back
- 10. ループでベクトルを消去する
- 11. ベクトルからの消去時のC++セグメンテーションエラー
- 12. ベクトルを消去または消去するC++の最速の方法
- 13. C++ベクトル要素の消去と新しいベクトルの作成
- 14. STLベクトル予備
- 15. C++ STLベクトル
- 16. STLベクトルとスレッドセーフ
- 17. 消去ReDimステートメントで配列対
- 18. キャストSTL :: STLへのポインタを含むベクトル::ベクトルは
- 19. STLマップ構築
- 20. ベクトルをC++で消去するとダブルフリーエラーが発生する
- 21. オブジェクトのベクトルから要素を消去する方法は?
- 22. C++のベクトルからオブジェクトを消去する
- 23. remove_ifはベクトルからすべてを消去します
- 24. 構造体ベクトルの要素を消去します
- 25. C++ベクトルは:: OpenCVのコードで問題を消去
- 26. C++ベクトル、消去が分かりません
- 27. 多次元ベクトルから要素を消去する
- 28. アルゴリズムでベクトル内の特定の要素を消去する
- 29. STL(リストのベクトル、隣接リスト)のベクトル - C++
- 30. C++ STLのmapは::キーで消去するC++ STLのmap、に関しては非既存のキー
セットについてのページにも同じメッセージがあります。 –