用于deque索引的C ++ swap()

时间:2011-09-08 04:41:36

标签: c++ algorithm swap deque

我有两个问题,第二个是可选的。 首先,在下面的程序(一个简单的卡程序的原型)中,我收到以下错误:

  

(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指出要回答这个或者指出任何可怕的编码实践,不包括课程的缺乏)

提前致谢!

3 个答案:

答案 0 :(得分:2)

您收到该错误的原因是因为声明 shuffle作为不接受任何参数的函数。

void shuffle();

另一个注意事项是,您可能希望在该函数中使用引用到deque,否则您将随机播放本地副本并且不会产生所需的副作用。

你可能希望它像这样:

void shuffle(deque<int>& dq);

此外,您可能希望使用iter_swap代替swap来交换元素。在出列时,它可能不会产生任何影响,但对于listmap,它会有所不同。

答案 1 :(得分:0)

我认为您忘记将参数放在函数声明中

void shuffle();

应该是

void shuffle(deque<int> dq);

答案 2 :(得分:0)

我认为问题在于,在程序的顶部你已经原型化了`shuffle as

void shuffle();

请注意,这不带任何参数。因为C ++使用一次性编译器,所以在你调用shuffle的时候,这是shuffle的唯一声明,因为编译器以后没有看到实现。因此,它会给你上面的错误,因为它认为你用一个参数调用零参数函数。

要解决此问题,请更新原型,使其与您实际定义的功能相匹配。

希望这有帮助!