2016-12-21 4 views
0

Я пытаюсь создать функцию в C++, которая возвращает 2D-вектор. Функция также имеет двумерный вектор в качестве аргумента, идея заключается в возврате модифицированной версии этого 2D-вектора с функцией.C++ Как сделать функцию 2D-вектор?

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

using std::vector; 

vector<vector<char> > function(vector<vector<char> > grid) { 

    int width = static_cast<int>(grid.front().size()); 
    int height = static_cast<int>(grid.size()); 

    for(int y=0; y < height; ++y) 
    { 
     for(int x=0; x < width; ++x) 
     { 
      grid[y][x]= 'H'; 
     } 
    } 
    return grid; 
} 

И я бы тогда сделать в главной:

vector<vector<char> > new_grid = function(grid); 

Но он не работает так, как я использую его, поэтому у меня есть несколько вопросов:

  1. Должен ли инициализироваться размер двумерной векторной функции?
  2. Могу ли я изменить размер grid внутри функции и вернуть более крупный 2D-вектор?
  3. И это может быть глупый вопрос, но действительно ли возможно получить значение, массив, строку, в функции без использования возврата, в функции void?

Благодарим за помощь!

Я могу показать весь свой код, если вы хотите, но он довольно большой и может быть не так ясен.

+3

Как это сделать * не работает *? – NathanOliver

+0

Перед доступом к любым векторным элементам с помощью оператора '[]' вам нужно использовать функцию 'resize()'. –

+0

, если 'grid.size() == 0', вызов [grid.front()] (http://en.cppreference.com/w/cpp/container/vector/front) - это UB. –

ответ

0

Чтобы ответить на ваши вопросы:

  1. если вы пытаетесь Переберите вектор установить свои значения, то да, это необходимо инициализировать. вектор начинается с 0 элементов, если вы вызываете конструктор по умолчанию. Чтобы установить размер, вы можете позвонить grid.resize(new_size), теперь все векторы внутри вашей сетки также имеют размер нуля, поэтому вы можете прокручивать сетку и изменять размер всех этих ...
  2. Да, вы можете изменить его размер и вернуть более крупный вектор, используйте .resize, это не повлияет на исходную сетку, поскольку вы передаете ее копию, а не ссылку на нее.
  3. Да, вы можете получить значение из функции void, если вы создаете ссылку на переменную в качестве параметра, вы можете изменить значение этой переменной. Вы можете прочитать об этом здесь: http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

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

+0

Спасибо, что это очень полезно! –

Смежные вопросы