C ++ swap () для индексов deque - PullRequest
       20

C ++ swap () для индексов deque

1 голос
/ 08 сентября 2011

У меня два вопроса, второй необязательный. Во-первых, в приведенной ниже программе (прототип простой карточной программы) я получаю следующую ошибку:

(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 ]

2 голосов
/ 08 сентября 2011

Причина, по которой вы получаете эту ошибку, заключается в том, что вы объявляете shuffle как функцию, не принимающую никаких аргументов.

void shuffle();

Еще одно замечание: вы, вероятно, хотите взять ссылка на deque в этой функции, в противном случае вы будете перетасовывать локальную копию и не будете иметь желаемого побочного эффекта.

Вы, вероятно, хотите, чтобы она выглядела следующим образом:

void shuffle(deque<int>& dq);

Также вы можете использовать iter_swap вместо swap для замены элементов.В очереди это, вероятно, не будет иметь значения, но для list или map это будет.

0 голосов
/ 08 сентября 2011

Я думаю, что проблема в том, что в верхней части вашей программы вы создали прототип `shuffle as

void shuffle();

Обратите внимание, что это не требует аргументов.Поскольку C ++ использует однопроходный компилятор, в тот момент, когда вы вызываете shuffle, это единственное доступное объявление shuffle, потому что компилятор не видел реализацию позже.Следовательно, он дает вам вышеуказанную ошибку, потому что думает, что вы вызываете функцию с нулевым аргументом с одним аргументом.

Чтобы исправить это, обновите прототип так, чтобы он соответствовал функции, которую вы фактически определили.

Надеюсь, это поможет!

0 голосов
/ 08 сентября 2011

Я думаю, что вы забыли добавить аргумент в объявление функции

void shuffle();

должно быть

void shuffle(deque<int> dq);
...