【发布时间】:2011-09-08 04:41:36
【问题描述】:
我有两个问题,第二个是可选的。 首先,在下面的程序中(一个简单卡片程序的原型),我收到以下错误:
(29): 错误 C2660: 'shuffle' : 函数不接受 1 个参数 使用以下代码:
#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() 的版本;)(Brownie 点回答这个或指出任何非常糟糕的编码实践,不包括缺少类)
提前致谢!
【问题讨论】:
-
接受您指出可怕的编码实践的提议:1) 使用
main而不是_tmain,因为_tmain不必要地限制了代码的可移植性。 2) 使用void shuffle(deque<int>& dq),否则程序将复制双端队列并对其进行洗牌。 3)不要在文件范围内using namespace std。更喜欢完全限定名称,或者在函数范围内使用using。 4) 如果你想打印双端队列,请查看this。 5)shuffle是正确的,但可以实现为std::random_shuffle。 -
不过不要太担心。这些点实际上都不是特别可怕。 ;)
-
感谢您的反馈。我不确定该算法的原因是因为它在牌组中放置了很多 0,但是对“deque.erase”的调用删除了位于 cardDeck[52] 上方位置的 0。我使用 _tmain 是因为更改它很麻烦,尤其是当我像我一样经常编程时。我只是刚刚接受了取消引用,从那时起,我已经实现了它。至于'using namespace',我只是为了方便而使用它,但在我可能发布或展示给朋友的更大程序上,我使用'std::'。第 5 个将来对我非常有用。谢谢^^