2010-10-06 9 views
2

J'essaye d'écrire un programme qui utilise une classe de base pour définir un algorithme pour résoudre un problème simple. J'utilise un vecteur d'ints comme un 'plateau de jeu'. Ma question est comment puis-je créer une fonction get_moves qui renvoie un vecteur de cartes de jeu?Vecteur de vecteurs C++

Voici le code que j'ai pour la fonction:

std::vector< <std::vector<int> > takeaway::generateMoves(std::vector<int> currBoard) { 


    if(currBoard[0] == 1 || currBoard[0] == 2) { 
     moves.push_back(1); 
    } 
    else if(currBoard[0] == 3) { 
     moves.push_back(2); 
    } 
    else if(currBoard[0] == 4) { 
     moves.push_back(3); 
    } 
    else { 
     moves.push_back(1); 
     moves.push_back(2); 
     moves.push_back(3); 
    } 

    std::vector< <std::vector <int > > toReturn(moves); 

    for(int i = 0; i < moves.size(); i++) { 

     std::cout << "MOVES: " << moves[i] << std::endl; 
    } 

    return toReturn; 

Les erreurs que je reçois sont:

takeaway.cpp: 55: Erreur: argument template 1 est invalide takeaway.cpp: 55: erreur: l'argument template 2 est invalide

Donc, ma question est comment puis-je créer et retourner correctement un vecteur de vecteurs?

+3

qui est la ligne 55 – pm100

Répondre

1

Il semble que vous essayez de construire le vector de vector<int> en utilisant seulement un vector<int>. Je ne peux pas voir comment moves est déclaré, mais basé sur le reste du code, je pense que cela va fonctionner.

std::vector<std::vector <int > > toReturn; 
toReturn.push_back(moves); 

Vous ne trouvez pas la valeur à l'aide de vectorvector s, mais peut-être cela est un échantillon partiel.

De même - le passage dans la carte par référence plutôt que par valeur serait plus efficace, car cela évite que tout soit copié. Vous ne le modifiez pas donc la référence const est meilleure.

std::vector< std::vector<int> > takeaway::generateMoves( 
    const std::vector<int>& currBoard) 

retour par valeur (ie vecteur < vecteur comme valeur de retour) est probablement OK puisque ce code sera probablement par optimisé pour éviter de prendre une copie de toReturn selon la NRVO.

Une alternative serait de transmettre une référence non-const à la structure requise, ce qui devrait être vide à l'entrée en fonction logique actuelle:

void takeaway::generateMoves( 
    const std::vector<int>& currBoard, std::vector< std::vector<int> >& toReturn) 
5

Vous avez trop de < « s sur vos déclarations de modèle .

std::vector< std::vector<int> > takeaway::generateMoves(std::vector<int> currBoard) 
{ 

    if(currBoard[0] == 1 || currBoard[0] == 2) { 
     moves.push_back(1); 
    } 
    else if(currBoard[0] == 3) { 
     moves.push_back(2); 
    } 
    else if(currBoard[0] == 4) { 
     moves.push_back(3); 
    } 
    else { 
     moves.push_back(1); 
     moves.push_back(2); 
     moves.push_back(3); 
    } 

    std::vector< std::vector<int> > toReturn; 
    toReturn.push_back(moves); 

    for(int i = 0; i < moves.size(); i++) { 

     std::cout << "MOVES: " << moves[i] << std::endl; 
    } 

    return toReturn; 
} 

Il pourrait y en avoir plus, mais c'est l'un d'entre eux.