C ++ вектор векторов - PullRequest
       9

C ++ вектор векторов

2 голосов
/ 06 октября 2010

Я пытаюсь написать программу, использующую базовый класс для определения алгоритма решения простой задачи. Я использую вектор целых как «игровое поле». У меня вопрос, как я могу создать функцию get_moves, которая возвращает вектор игровых досок?

Вот код, который у меня есть для функции:

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;

Я получаю следующие ошибки:

takeaway.cpp: 55: ошибка: неверный аргумент шаблона 1 takeaway.cpp: 55: ошибка: неверный аргумент шаблона 2

Итак, мой вопрос: как мне правильно создать и вернуть вектор векторов?

Ответы [ 2 ]

5 голосов
/ 06 октября 2010

У вас слишком много <в объявлениях вашего шаблона. </p>

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;
}

Могло бы быть и больше, но это один из них.

1 голос
/ 06 октября 2010

Похоже, вы пытаетесь построить vector из vector<int>, используя только vector<int>.Не вижу, как объявляется moves, но на основе остальной части кода, я думаю, что это будет работать.

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

Не вижу значения при использовании vector из vector s здесь, но, возможно, это частичная выборка.

Кроме того, передача в доске по ссылке, а не по значению была бы более эффективной, поскольку это позволяет избежать копирования всего объекта.Вы не изменяете его, так что ссылка const лучше.

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

Возврат по значению (т.е. вектор <вектор как возвращаемое значение), вероятно, в порядке, так как этот код, вероятно, будет оптимизирован, чтобы избежать копирования<code>toReturn в соответствии с NRVO .

Альтернативой может быть передача неконстантной ссылки на требуемую структуру, которая должна быть пустой при входе, чтобы соответствовать текущей логике:

void takeaway::generateMoves( 
    const std::vector<int>& currBoard, std::vector< std::vector<int> >& toReturn )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...