2011-09-08 5 views
1

두 개의 질문이 있는데, 두 번째 질문은 선택 사항입니다.큐 인덱스의 C++ 스왑()

(29): error C2660: 'shuffle' : function does not take 1 arguments with the following code:

#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();)을 사용한다. (이것에 대답하거나 클래스의 부족을 포함하지 않는 무서운 코딩 습관을 지적하기위한 브라우니 포인트)

미리 감사드립니다! 함수가 복용하지

+0

엄청나게 끔찍한 코딩 방법을 지적 해 주겠다는 제안을 받아 들인다 : 1)'_tmain' 대신에'main'을 사용하십시오.'_tmain'은 불필요하게 코드의 이식성을 제한합니다. 2)'void shuffle (deque & dq)'를 사용하십시오. 그렇지 않으면 프로그램은 deque를 복사하고 그 내용을 섞습니다. 3) 파일 범위에서'namespace std'를 사용하지 마십시오. 이름을 완전하게 한정하거나 함수의 범위 내에서'using '을 사용하는 것을 선호합니다. 4) deques를 인쇄하려면 [this] (http://stackoverflow.com/questions/4850473/pretty-print-c-stl-containers)를보십시오. 5)'shuffle'은 정확하지만'std :: random_shuffle'으로 구현 될 수 있습니다. – Mankarse

+0

너무 많이 걱정하지 마십시오. 그 점들 중 실제로 끔찍한 점은 하나도 없습니다. ;) – Mankarse

+0

피드백을위한 Thnx입니다. 알고리즘에 대해 확신 할 수없는 이유는 데크에 0을 많이 넣었 기 때문 이었지만 'deque.erase'를 호출하면 cardDeck [52]보다 위에있는 0이 제거되었습니다. 나는 그것을 자주 바꾸는 것이 번거롭기 때문에 _tmain을 사용합니다. 나는 단지 역 참조 (dereferencing)와 관련된 용어에 대해서만 언급했고 그 이후로 구현했다. '네임 스페이스 사용하기'에 관해서는 편의를 위해 사용하는 것뿐입니다.하지만 더 큰 프로그램에서는 공개하거나 공개 할 수도 있습니다. 'std ::'를 사용합니다. 5 번째 장래에 나에게 매우 유용 할 것입니다. 감사합니다 ^^ – Aarowaim

답변

2

당신이shuffle을 선언 때문에 해당 오류가 얻을 이유해야 당신이 당신의 함수 선언에 인수를 넣어 깜빡 생각 모든 인수.

void shuffle(); 

또 다른 참고

그렇지 않으면 로컬 복사본을 셔플 것입니다 원하는 부작용이 없습니다, 당신은 아마 그 함수의 양단 큐에 참조을 할 것입니다.

void shuffle(deque<int>& dq); 

또한, 요소를 교환 iter_swap 대신 swap을 사용할 수 있습니다 :

당신은 아마 다음과 같이 LOK 싶다. dequeue에서는 차이를 만들지 않을 것이지만 list 또는 map에 대해서는 차이가 있습니다.

+0

대단히 고맙습니다. 프로그래머가되어서 가장 분명한 문제의 원인을 찾고 분주함을 잊었습니다. // * facepalm *. 지금은 잘 작동하고 있으며 참조를 전달하는 팁에 대해서도 감사드립니다. – Aarowaim

0

나는

void shuffle(); 

void shuffle(deque<int> dq); 
0

나는 문제가 프로그램의 상단에 당신이 인수를 취하지 않는 것을

void shuffle(); 

공지 사항으로`셔플 프로토 타입을했다고 생각합니다. C++은 원 패스 컴파일러를 사용하기 때문에 shuffle을 호출하는 시점에서 컴파일러가 나중에 구현을 보지 못했기 때문에 이것이 사용 가능한 shuffle의 유일한 선언입니다. 결과적으로, 위의 오류를 제공합니다. 이는 하나의 인수로 인수가없는 함수를 호출한다고 생각하기 때문입니다.

이 문제를 해결하려면 실제로 정의한 기능과 일치하도록 프로토 타입을 업데이트하십시오.

희망이 도움이됩니다.