我有两个问题,第二个是可选的。 首先,在下面的程序(一个简单的卡程序的原型)中,我收到以下错误:
(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指出要回答这个或者指出任何可怕的编码实践,不包括课程的缺乏)
提前致谢!
答案 0 :(得分:2)
您收到该错误的原因是因为声明 shuffle
作为不接受任何参数的函数。
void shuffle();
另一个注意事项是,您可能希望在该函数中使用引用到deque,否则您将随机播放本地副本并且不会产生所需的副作用。
你可能希望它像这样:
void shuffle(deque<int>& dq);
此外,您可能希望使用iter_swap
代替swap
来交换元素。在出列时,它可能不会产生任何影响,但对于list
或map
,它会有所不同。
答案 1 :(得分:0)
我认为您忘记将参数放在函数声明中
void shuffle();
应该是
void shuffle(deque<int> dq);
答案 2 :(得分:0)
我认为问题在于,在程序的顶部你已经原型化了`shuffle as
void shuffle();
请注意,这不带任何参数。因为C ++使用一次性编译器,所以在你调用shuffle的时候,这是shuffle的唯一声明,因为编译器以后没有看到实现。因此,它会给你上面的错误,因为它认为你用一个参数调用零参数函数。
要解决此问题,请更新原型,使其与您实际定义的功能相匹配。
希望这有帮助!