2017-01-21 12 views
0

私はカードゲームのプログラミングに忙しいです。このカードゲームでは、デッキをシャッフルします。デッキはユニークなポインタのベクトルであり、このようになります。std :: shuffleを使って、ランダムなシーケンスで一意のポインタでベクトルをシャッフルする方法はありますか?

std::vector<std::unique_ptr<Cards>> _deck; 

私はからのシャッフル機能をランダムシーケンスを取得しようとしましたが、私は次のエラーました:STD「関数テンプレートのインスタンスを」::シャッフルは、「引数ベクトルが一致する」。」。引数については、以下のコードブロックを表示します。

std::shuffle(_buildings_deck.begin(), _buildings_deck.back(), std::default_random_engine{}); 

私の知る限り、私が使用していた引数が正しいか見ることができるように、私はまだランダムエンジンを選択する必要がありますが、それで問題ではないはずです。シャッフルを使用して、一意のポインタのベクトルをランダムに並べ替えることは可能でしょうか?そうですね?

+0

reference_wrapper(http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper)のベクトル(またはリスト)をシャッフルします。 –

+0

'Card'が整数以外の理由はありますか?なぜヒープ割り当てのものをここで使用していますか? –

+0

@JesperJuhl私はこのコードを試しました: "std :: vector > ref(_buildings_deck.begin()、_buildings_deck.end()); \t std :: shuffle(ref.begin()、 ref.end()、std :: mt19937 {std :: random_device {}()});しかし、今私は、削除された関数を参照しようとしているというエラーが出ます。良いコピーコンストラクタがないうちに変数をコピーしようとすると、それがよくあるエラーであることがわかります。また、私は一意のポインタを使用しているので、変数をコピーすることはできません。だから、それは問題だろうか?それとも、私は悪いコードを書きましたか? – user3473161

答えて

5

std :: shuffle()は、std :: vectorが持つランダムアクセスイテレータを想定しています。 std :: listをstd :: vectorに置き換える必要があります。

+1

任意のランダムアクセスイテレータが行います。 std :: array、std :: deque、std :: vectorを使うことができます。 –

+0

彼は単にreference_wrapperのベクトルを作成して、それをシャッフルしてリストのシャッフル表示を得ることができます。 –

関連する問題