In my application, I have a CMap of CString values. After adding the elements in the Map, if I retrieve the elements in some other place, am not getting the elements in the order of insertion.Suppose I retrieve the third element, I get the fifth like that. Is it a behavior of CMap. Why this happens?
2 に答える
あなたは「なぜ」を尋ねたので、ここに行きます:
Map は、キーによって値を取得する効率的な方法を提供します。リストや配列よりも高速な巧妙なデータ構造を使用してこれを行います (要素がそこにあるかどうかを知る前に、リスト全体を検索する必要があります)。メモリ使用量の増加や、他のことを実行できない (挿入された順序を知るなど) などのトレードオフがあります。
これを実装するには、2 つの一般的な方法があります。
- ハッシュ値によってキーをバケットに入れるハッシュマップ。
- ソート方法に従ってキーを二分木に配置するツリーマップ
マップを反復処理できますが、キーの順序 (ツリーマップ) または完全に予測不可能 (ハッシュマップ) のいずれかで、マップが内部に格納されている方法に従います。あなたの CMap はハッシュマップのようです。
いずれにせよ、挿入順序は保持されません。それが必要な場合は、追加のデータ構造 (リストなど) が必要です。
ドキュメントを CMap に読み込んでみませんか? http://msdn.microsoft.com/ru-ru/library/s897094z%28v=vs.71%29.aspx
それは本当に順序付けられていないマップです。どのように要素を取得しますか? GetStartPosition
とGetNextAssoc
? _ http://msdn.microsoft.com/ru-ru/library/d82fyybt%28v=vs.71%29.aspx読む ここにコメント
備考
反復シーケンスは予測できません。したがって、「マップの最初の要素」には特別な意味はありません。
CMap は、一意のキーを値にマップするディクショナリ コレクション クラスです。キーと値のペア (要素) をマップに挿入すると、キーを使用してペアにアクセスして効率的に取得または削除できます。マップ内のすべての要素を反復処理することもできます。