18

C ++標準ライブラリには「順序集合」データ構造がありますか?順序集合とは、通常とまったく同じstd::setですが、アイテムを追加した順序を覚えているものを意味します。

そうでない場合、1つをシミュレートするための最良の方法は何ですか?追加された数と実際の値を各ペアに格納するペアのセットを作成するようなことができることは知っていますが、もっと簡単な解決策がある場合は、フープを飛び越えたくありません。

4

6 に答える 6

17

単一の同種のデータ構造にはこのプロパティはありません。これは、シーケンシャル (つまり、要素が挿入順に配置される) または連想 (要素が値に応じて何らかの順序で配置される) のいずれかであるためです。

最善のクリーンなアプローチは、おそらくBoost.MultiIndexのようなものでしょう。これにより、コンテナに複数のインデックスまたは「ビュー」を追加できるため、シーケンシャル インデックスと順序付きインデックスを使用できます。

于 2011-10-18T00:23:17.457 に答える
7

使用しているタイプの std::set を作成する代わりに、オブジェクトの std::pair と、挿入ごとにインクリメントされるインデックスを渡してみませんか?

于 2011-10-18T00:20:42.963 に答える
3

いいえ、違います。

このようなコンテナーには、2 つの異なる反復子が必要になると思われます。1 つは追加の順序で定義された順序で反復し、もう 1 つは通常のset順序で反復します。標準ライブラリにはそのようなものはありません。

それをシミュレートする 1 つのオプションsetは、関心のある実際のデータに加えて、侵入型のリンク リスト ノードを含むタイプの を用意することです。要素をsetに追加したら、それをリンク リストに追加します。から要素を削除する前にset、リンクされたリストから要素を削除してください。セット要素へのポインターは、その要素を削除する以外の操作によって無効にされないため、これは問題ないことが保証されています。

于 2011-10-18T00:21:18.303 に答える
0

答えはかなり単純だと思いました。セットを別の反復可能な構造(たとえば、キュ​​ー)と組み合わせます。要素が挿入された順序でセットを反復したい場合は、最初に要素をキューにプッシュし、最初の要素で作業を行ってから、ポップアウトしてセットに入れます。

于 2014-03-21T19:39:17.997 に答える
-3

はい、ベクトルまたはリスト (または配列) と呼ばれます。ベクトルに追加して、要素をセットに追加します。

于 2011-10-18T00:23:58.193 に答える