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++:std :: map sorting
- 3. CバージョンのC++ std :: map
- 4. std :: tupleの要素への参照を取得するには?
- 5. C++ Boost.Rangeのタプル - 要素型のタプルを取得しますか?
- 6. std :: mapをstd :: setをC++にコピー
- 7. std :: mapのタイプ要件
- 8. テンプレートクラス値のC++ std :: map
- 9. 挿入時に基づいてstd :: mapから要素を削除します
- 10. STDの最後の要素を取得する::文字列
- 11. 要素(またはタグ)の内容を取得するPugiXML C++
- 12. std :: mapをstd :: mapのキーとして使用する
- 13. C#の取得配列の要素数
- 14. MySQL - リンクテーブルから要素を取得しますが、それらの要素のみを取得します。
- 15. std :: mapをCに移植しますか?
- 16. JQueryは要素で始まるテキストを取得します
- 17. 要素を取得し、
- 18. C#でオブジェクトから要素を取得するには?
- 19. オブジェクトCで要素をxmlから取得する方法は?
- 20. javascriptで現在の要素の1レベル下の要素を取得します
- 21. タプル要素の型のインデックスを取得しますか?
- 22. std :: mapは初期化する必要がありますか?
- 23. C++ std :: mapをシリアライズ/デシリアライズ from/toファイル
- 24. C++:std :: bindの引数を取得します。
- 25. LI要素のoffsetWidth(または同等の要素)の取得
- 26. Doxygenがstd :: shared_ptrまたはstd :: mapを認識できるか
- 27. C++でベクトルの要素のランクを取得する方法
- 28. c#でHTML要素の実際のマージンを取得する
- 29. C++ std :: mapで最大のキーを見つけるには?
- 30. XElementを使用してC#の最後の要素を取得
今、 'std :: next'があります。 :) – erip