2013-09-21 12 views
6

は、C++の "標準ライブラリ"に、挿入順序で順序を保持する能力を持つ任意の "連想"(すなわち "Key-Value")コンテナ/データ構造がありますか?挿入オーダーを保持するC + 11連想コンテナ?

私はこれについていくつかの話題を見てきましたが、C++ 11よりもずっと前です。

「boost :: multi_index」を使用することをお勧めしますが、可能であれば標準のコンテナ/構造体を「むしろ」使用します。

C++ 11には、いくつかの「順序付けられていない」連想コンテナがあります。linkです。

これらはいずれも「設定可能」なので、挿入順でのみ並べ替えられますか?

ありがとうございます!

C

+2

unordered_mapとベクトルを一緒に使う – aaronman

+1

'std :: vector >'を探していますか? –

+0

Javaの* LinkedHashMap *と同等の機能が必要ですか? – hyde

答えて

1

あなたはランダムとリニアアクセスを混合しています。非常に良いベッドフェローではありません。

インデックスを使用してマップに加えて、vector/list(挿入順序)の両方を使用してください。

+2

彼らは非常に良いbedfellows、非常に、これを必要とし、そのようなコンテナを持っていることは、実装も賢明です。 C++にそれがない場合、私は少し驚いています。例:http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html – hyde

+0

@hyde - 2つのデータ構造をリンクするだけです。 2つではありません。 –

+0

ハッシュマップはすでに内部的にいくつかのデータ構造の組み合わせであるため、違いはありません。挿入順序付きハッシュマップはかなりのコードを必要とし、クラス内にラップする必要があります。通常の順序付けられていないハッシュマップとして挿入順を維持してもソートされた順序を保持するのと異なり、アルゴリズム効率には影響しないことに注意してください。 – hyde

0

いいえ;そのような能力は、パフォーマンスの名の下に明らかに犠牲にされた。

再ハッシュを含む操作で同等の項目の順序を保持する必要がありますが、元の順序を指定する方法はありません。理論的には、挿入するたびにオブジェクトを希望の順序に並べ替えるためにstd::rotateなどを使用できます。明らかに実用的ではありませんが、機能の欠如が少し恣意的であることが証明されています。

あなたの最善の策は、内側のコンテナにサブシーケンスを保持することです。このような「深い」コンテナを1つのシーケンスのように繰り返し処理するには、イテレータアダプタを使用することができます。そのようなユーティリティはおそらくBoostにあります。

0

No. 順序付けされていないマップでも、挿入順に格納されません。

ベクトルを使用すると、キーのトラックを保持することができます

関連する問題