C++でstd :: mapのランダムキーを取得する方法は?イテレータを使用して? 私は余分なデータ構造を維持したくありませんはstd :: mapのランダムキー要素をC++で取得します
答えて
std::map
イテレータは双方向です。つまり、ランダムキーを選択するとO(n)
となります。別のデータ構造を使用しない場合、基本的に唯一の選択はbegin()
のランダムな増分でstd::advance
を使用することです。たとえば、次のように
std::map<K, V> m;
auto it = m.begin();
std::advance(it, rand() % m.size());
K random_key = it->first;
(それとも、<random>
へのアクセス権を持っている場合(例えば)std::mt19939
でrand()
をスワップアウト)。
これは、あなたの目的に応じてランダムなものに依存します。 std::map
はソートされたコンテナですが、要素番号によるランダムアクセスはサポートされていません。キーセットの知識と知識があれば、lower_bound
またはupper_bound
を使用してマップを掘り起こすポイントをランダムに選択して、その近くのエレメントを見つけることができます。これは、それらの要素とマップの他の要素との間のギャップに基づいて要素をピッキングする傾向があります。つまり、要素/ギャップ自体が効果的にランダムであれば、初期結果は効果的にランダムと見なされますが、均等に分散。
例えば、あなたのキーが大文字で、キー 'C'、 'O'、 'Q'、 'S'がマップ内にあるとします。もしあなたがAZからランダムな文字を生成するならば、Qに近いPQRだけであるため、C、O、またはSで終了する可能性がさらに高くなります。上限または下限を使用すると、 2つの要素があるにもかかわらず2/26のチャンスです。それでも、C、O、Q、Sの選択にランダム性がある場合は、ギャップと選択がランダムであると主張できます。
このようにしてコンテナに刺し込み、小さな反復子の増分/減分を行うことで少し改善できますが、依然として本当にランダムではありません。
本当にランダムな結果を得るには、リストまたは1つずつのトラバーサルを避けたいセカンダリインデックスコンテナを進める必要があります。
- 1. std :: mapの最初のn要素を取得する方法
- 2. C++ mapのfind_if要素
- 3. Javascript ES6 Mapの要素を取得または設定しますか?
- 4. C++:std :: map sorting
- 5. C++のクラッシュstd :: map
- 6. プライベートstd :: mapから値を取得
- 7. CバージョンのC++ std :: map
- 8. std :: mapをラップして要素へのポインタを提供
- 9. std :: tupleの要素への参照を取得するには?
- 10. std :: mapをstd :: setをC++にコピー
- 11. C++ Boost.Rangeのタプル - 要素型のタプルを取得しますか?
- 12. std :: mapにデフォルト以外の構成要素を挿入する
- 13. iframe要素をC#で取得する
- 14. C#Regexは式内の要素を取得します
- 15. std :: map内の要素への参照を無効にできますか?
- 16. テンプレートクラス値のC++ std :: map
- 17. std :: map :: insertのC++セグメンテーションフォールト
- 18. std :: mapのタイプ要件
- 19. Boost.Pythonでstd :: mapまたはstd :: vector引数を取るコンストラクタでC++クラスをラップする方法は?
- 20. 要素(またはタグ)の内容を取得するPugiXML C++
- 21. STDの最後の要素を取得する::文字列
- 22. 挿入時に基づいてstd :: mapから要素を削除します
- 23. C++のstd :: mapは "*"に失敗していますか?
- 24. std :: mapスレッドセーフでC++ 11を挿入しますか?
- 25. std :: mapをstd :: mapのキーとして使用する
- 26. C++マップは、2番目の要素がXのときに最初の要素を取得します
- 27. std :: arrayまたはCスタイルの配列の要素型を取得するtrait型
- 28. C++はループの問題でstd :: list要素を削除します
- 29. C#webBrowserクラス内の要素を取得
- 30. XPathは前の要素のテキストで要素を取得します
今、 'std :: next'があります。 :) – erip