2008-09-09 16 views
14

STLでは、ほぼすべてのコンテナに消去機能があります。私が持っている質問はベクトルにあり、erase関数はベクトルの次の要素を指すイテレータを返します。マップコンテナはこれを行いません。代わりに、voidを返します。誰にもこの不一致がなぜあるのか知っていますか?STLベクトル対マップ消去

答えて

26

を参照してくださいhttp://www.sgi.com/tech/stl/Map.html

地図は がマップ に新しい要素を挿入すると、既存の要素に ポイントというイテレータを無効にしないことが重要な特性を持っています。 要素をマップから消去しても、 は、 の反復子を無効にします。反復子の場合、実際には は、 の要素を指しています。

イレーサをイレーザに戻すのは、リストの要素を消去して行くことができるようにするためです。アイテムを消去しても既存のイテレータが無効にならない場合は、これを行う必要はありません。

+0

セットについてのページにも同じメッセージがあります。 –

1

私はこれが答えかどうか分かりませんが、次の要素の位置付けのコストが原因である可能性があります。マップを反復することは、本質的に「遅い」ことです。

4

この不一致は、使用に起因するものです。 vectorは、要素上で順序付けを行うシーケンスです。 mapの要素もいくつかの比較基準に従って順序付けされているのは事実ですが、この順序は構造からは明らかではありません。ある要素から次の要素に至る効率的な方法はありません(効率=一定時間)。実際、マップ上で反復するのは非常に高価です。イテレータまたはイテレータ自体の作成には、完全なツリーを散策する必要があります。これは、スタックが使用されている場合を除き、n)で実行することはできません。この場合、必要なスペースはもはや一定ではありません。

すべての場合、消去後に「次の」要素を戻す安価な方法はありません。シーケンスの場合、です。

さらに、Robが適切です。マップがイテレータを返す必要はありません。

3

MS Visual Studio C++(Dinkumware IIRC)に同梱されているSTLは、イテレータを次の要素に返すerase関数を持つマップ実装を提供します。

標準に準拠していないことに注意してください。

12

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)。

関連する問題