C ++標準ライブラリには「順序集合」データ構造がありますか?順序集合とは、通常とまったく同じstd::set
ですが、アイテムを追加した順序を覚えているものを意味します。
そうでない場合、1つをシミュレートするための最良の方法は何ですか?追加された数と実際の値を各ペアに格納するペアのセットを作成するようなことができることは知っていますが、もっと簡単な解決策がある場合は、フープを飛び越えたくありません。
C ++標準ライブラリには「順序集合」データ構造がありますか?順序集合とは、通常とまったく同じstd::set
ですが、アイテムを追加した順序を覚えているものを意味します。
そうでない場合、1つをシミュレートするための最良の方法は何ですか?追加された数と実際の値を各ペアに格納するペアのセットを作成するようなことができることは知っていますが、もっと簡単な解決策がある場合は、フープを飛び越えたくありません。
単一の同種のデータ構造にはこのプロパティはありません。これは、シーケンシャル (つまり、要素が挿入順に配置される) または連想 (要素が値に応じて何らかの順序で配置される) のいずれかであるためです。
最善のクリーンなアプローチは、おそらくBoost.MultiIndexのようなものでしょう。これにより、コンテナに複数のインデックスまたは「ビュー」を追加できるため、シーケンシャル インデックスと順序付きインデックスを使用できます。
使用しているタイプの std::set を作成する代わりに、オブジェクトの std::pair と、挿入ごとにインクリメントされるインデックスを渡してみませんか?
いいえ、違います。
このようなコンテナーには、2 つの異なる反復子が必要になると思われます。1 つは追加の順序で定義された順序で反復し、もう 1 つは通常のset
順序で反復します。標準ライブラリにはそのようなものはありません。
それをシミュレートする 1 つのオプションset
は、関心のある実際のデータに加えて、侵入型のリンク リスト ノードを含むタイプの を用意することです。要素をset
に追加したら、それをリンク リストに追加します。から要素を削除する前にset
、リンクされたリストから要素を削除してください。セット要素へのポインターは、その要素を削除する以外の操作によって無効にされないため、これは問題ないことが保証されています。
答えはかなり単純だと思いました。セットを別の反復可能な構造(たとえば、キュー)と組み合わせます。要素が挿入された順序でセットを反復したい場合は、最初に要素をキューにプッシュし、最初の要素で作業を行ってから、ポップアウトしてセットに入れます。
はい、ベクトルまたはリスト (または配列) と呼ばれます。ベクトルに追加して、要素をセットに追加します。