【问题标题】:C++ swap() for deque indexes双端队列索引的 C++ swap()
【发布时间】: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&lt;int&gt;&amp; dq),否则程序将复制双端队列并对其进行洗牌。 3)不要在文件范围内using namespace std。更喜欢完全限定名称,或者在函数范围内使用using。 4) 如果你想打印双端队列,请查看this。 5)shuffle是正确的,但可以实现为std::random_shuffle。
  • 不过不要太担心。这些点实际上都不是特别可怕。 ;)
  • 感谢您的反馈。我不确定该算法的原因是因为它在牌组中放置了很多 0,但是对“deque.erase”的调用删除了位于 cardDeck[52] 上方位置的 0。我使用 _tmain 是因为更改它很麻烦,尤其是当我像我一样经常编程时。我只是刚刚接受了取消引用,从那时起,我已经实现了它。至于'using namespace',我只是为了方便而使用它,但在我可能发布或展示给朋友的更大程序上,我使用'std::'。第 5 个将来对我非常有用。谢谢^^

标签: c++ algorithm swap deque


【解决方案1】:

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

void shuffle();

另一个注意事项是,您可能希望在该函数中获取对双端队列的 reference,否则您将打乱本地副本并且不会产生所需的副作用。

您可能希望它看起来像这样:

void shuffle(deque<int>& dq);

另外,您可能希望使用iter_swap 而不是swap 来交换元素。在 dequeue 中,它可能不会产生影响,但对于 list 或 map 会产生影响。

【讨论】:

  • 非常感谢,作为一名程序员,我正忙于寻找问题的最模糊原因,以至于我忘记了明显的 //*facepalm*。它现在工作正常,也感谢您提供有关传递参考的提示。
【解决方案2】:

我想你忘了把参数放在你的函数声明中

void shuffle();

应该是

void shuffle(deque<int> dq);

【讨论】:

    【解决方案3】:

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

    void shuffle();
    

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 2020-11-08
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 2011-01-18
      相关资源
      最近更新 更多