私はstd::map<unsigned int,double>
をキーと値をまとめて要素を混合する方法でランダム化する方法を探していました。あなたは良い提案をしていますか?私はstd::random_shuffle
がマップでは動作しないことを発見しました。私の場合、値をベクトル形式でシャッフルすることは役に立ちません。どんな提案もありがとうございます!C++で無作為化マップ
答えて
std::map
is a sorted associative containerです。したがって、キーと値のペアの任意の再配置をサポートしていません。
キーと値を関連付けるマップを必要とすると仮定すると、あなたは別の反復シーケンスを定義するために、マップ要素へのポインタの補助std::vector
を使用することができます。
using pair_type = std::pair<unsigned int, double>;
std::vector<const pair_type*> pair_ptrs;
for(const auto& p : your_map)
{
pair_ptrs.emplace_back(&p);
}
std::shuffle(std::begin(pair_ptrs), std::end(pair_ptrs), /* ... */);
(そのstd::random_shuffle
is deprecatedに注意してください。 )
ありがとう、あなた、それは面白いアプローチです。次のステップでは、マップ上でforループを実行します。for(auto it = ++ areas.begin(); it!= areas.end(); it ++){} 'ポインタを使用するときにどのように言い換えることができますか? –
または単に 'while(pair_ptrs ++){}'を使うことはできますか? –
あなたはポインタベクトル自体を繰り返します: 'for(const auto&ptr:pair_ptrs){do_something(* ptr);} } '。 –
std::map
は、特定のコンテナがコンパレータで指定された順序で要素を格納するため、シャッフルすることは不可能です。 std::unordered_map
は、ハッシュ関数に従って要素を格納するため、(簡単に)どちらも使用できません。
あなたの最善の策はstd::vector<std::pair<unsigned int,double>>
です。 std::shuffle
を使ってシャッフルすることができます。
- 1. 層別化と無作為抽出で
- 2. PHPリターン無作為化配列
- 3. searchkickの結果を無作為化
- 4. PHP配列を無作為化する
- 5. 配列を無作為化する
- 6. 反復トゥイーンでTweenjs無作為化された値
- 7. アンドロイドスタジオでアニメーション無作為化された背景
- 8. アンドロイドでの無作為ジオポイント作成
- 9. 流星の無作為サンプリング
- 10. ページの無作為イメージload
- 11. 無作為抽出アルゴリズム
- 12. 無作為一致検索
- 13. Pythonリスト無作為選択
- 14. 無作為抽出サンプリング行
- 15. IIS7エラー500無作為に
- 16. C#無作為にWordが選択できない
- 17. Pythonで無作為にサンプルをチェック
- 18. 3D無作為化された惑星の生成
- 19. パネルを無作為にランダム化する方法
- 20. 無作為化バックストレッチセットに画像を追加 - jqueryの
- 21. 数字のセットを無作為化する方法
- 22. クイズ複数の選択肢を無作為化する方法
- 23. 背景を無作為化する方法は?
- 24. リズムゲームスウィフト2の円を無作為化する
- 25. Laravel:無作為化順序に関係します
- 26. PHP/MySQL - 無作為なセミコロン出力
- 27. 無作為にクラッシュするUITableView
- 28. 配列内の無作為な順序
- 29. ループのない無作為なムービークリップ?
- 30. 無作為グラフを生成する
'map'は定義順に並べられますが、シャッフルできません。 'unordered_map'で要素の順序を設定することはできません。あなたの唯一の選択は、 'vector'のような順序を持つコンテナを使うことです。 –
std :: mapはその定義の一部としてソートされたキーを持っています "std :: mapは*ソートされた*連想型コンテナ"(http://en.cppreference.com/w/cpp/container/map) –