2017-01-09 6 views
0

私はstd::map<unsigned int,double>をキーと値をまとめて要素を混合する方法でランダム化する方法を探していました。あなたは良い提案をしていますか?私はstd::random_shuffleがマップでは動作しないことを発見しました。私の場合、値をベクトル形式でシャッフルすることは役に立ちません。どんな提案もありがとうございます!C++で無作為化マップ

+3

'map'は定義順に並べられますが、シャッフルできません。 'unordered_map'で要素の順序を設定することはできません。あなたの唯一の選択は、 'vector'のような順序を持つコンテナを使うことです。 –

+0

std :: mapはその定義の一部としてソートされたキーを持っています "std :: mapは*ソートされた*連想型コンテナ"(http://en.cppreference.com/w/cpp/container/map) –

答えて

3

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に注意してください。 )

+0

ありがとう、あなた、それは面白いアプローチです。次のステップでは、マップ上でforループを実行します。for(auto it = ++ areas.begin(); it!= areas.end(); it ++){} 'ポインタを使用するときにどのように言い換えることができますか? –

+0

または単に 'while(pair_ptrs ++){}'を使うことはできますか? –

+0

あなたはポインタベクトル自体を繰り返します: 'for(const auto&ptr:pair_ptrs){do_something(* ptr);} } '。 –

2

std::mapは、特定のコンテナがコンパレータで指定された順序で要素を格納するため、シャッフルすることは不可能です。 std::unordered_mapは、ハッシュ関数に従って要素を格納するため、(簡単に)どちらも使用できません。

あなたの最善の策はstd::vector<std::pair<unsigned int,double>>です。 std::shuffleを使ってシャッフルすることができます。