私は2つの質問があり、2番目はオプションです。私はこのエラーを受け取るのはなぜデキューインデックスのC++スワップ()
(29): error C2660: 'shuffle' : function does not take 1 arguments with the following code:
#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <deque>
#include <algorithm>
using namespace std;
deque<int> cardDeck (51);
void flip(); //Prototype flip()
void shuffle(); //Prototype shuffle()
int _tmain(int argc, _TCHAR* argv[])
{
ostream& operator<<(ostream& os, deque<int> dq); //overload << operator to accept deque
//arguments
for (int a=52; a>0; a--) { //initialize the 52 cards in a deck
cardDeck.push_front(a);
}
flip(); //prompt my input to check data
return 0;
}
void flip() { //flip over card in specified location in the deck
int input;
cin >> input;
cout<<cardDeck[input]<<endl;
shuffle(cardDeck);
flip();
}
void shuffle(deque<int> dq) { //use Fisher-Yates algorithm to efficiently and accurately
//randomize card order
for(int i=dq.size()-1; i>-1; i--) {
int j = rand() % (i + 1);
if(i != j) {
swap(dq[j], dq[i]);
}
}
}
: まず、(簡単なカードプログラムのプロトタイプ)以下のプログラムでは、私は次のエラーを取得していますか?私はfisher-yatesアルゴリズムを正しく実行しているのかどうかは分かりません。なぜなら、C++のドキュメントは見つからないからです。 swap();)を利用しています(これに答えるためのブラウニーポイントまたはクラスの欠如を除いて、ひどくひどいコーディング実践を指摘するためのブラウニーポイント)
ありがとうございます!私はあなたがあなたの関数宣言で
void shuffle();
を引数を置くことを忘れてしまったと思います
ひどくひどいコーディング方法を指摘してください。1) '_tmain'の代わりに' main'を使います。 '_tmain'はコードの移植性を不必要に制限します。 2) 'void shuffle(deque&dq)'を使用します。そうでない場合、プログラムは両端キューをコピーしてシャッフルします。 3)ファイルスコープで 'namespace std'を使わないでください。名前を完全に修飾するか、関数の範囲内で '使用する 'ことをお勧めします。 4)dequesを印刷する場合は、[this](http://stackoverflow.com/questions/4850473/pretty-print-c-stl-containers)をご覧ください。 5) 'shuffle'は正しいですが、' std :: random_shuffle'として実装できます。 –
Mankarse
あまりにも心配しないでください。これらの点は実際には特に恐ろしいものではありません。 ;) – Mankarse
フィードバック用のThnx。アルゴリズムについて私が確信していなかった理由は、デッキに0をたくさん入れていたからですが、 'deque.erase'を呼び出すと、cardDeck [52]の上にある0が取り除かれました。私はそれを変更するのは迷惑なので、特に私が頻繁に行うようにプログラムすると、私は_tmainを使います。私はちょうど逆参照の条件に来て、それ以来、私はそれを実装しました。 '名前空間を使用する'に関しては、便宜的に使用するだけですが、公開するかもしれない大きなプログラムでは、私は 'std ::'を使用します。 5番目は将来私のために非常に役立つだろう。ありがとう^^ – Aarowaim