Как передать двумерный вектор в функцию c

от admin

Передача 2-мерного вектора в функцию

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

Почему-то при таком вызове функции:

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

Я не понимаю почему, потому что они одного типа .

3 ответа

Здесь происходит pass by reference , который отличается от pass by pointer , где вы передаете адрес переменной в функцию (при ее вызове), а определение функции принимает указатель. Здесь вы в основном передаете указатель на вектор в качестве аргумента и, таким образом, выполняете pass by pointer :

, тогда как согласно определению вашей функции здесь происходит pass by reference , следовательно, просто передайте вектор, как он есть в функции:

Разница между двумя указанными выше методами состоит в том, что pointer может быть NULL , но references никогда не будет NULL , и поэтому мы уверены, что ссылаемся на допустимую переменную. Вот почему рекомендуется использовать references , когда это возможно, и использовать pointers только тогда, когда это необходимо.

Многомерные векторы

Статический массив в соответствии с синтаксисом языка есть массив массивов, т. е. массив, элементами которого служат массивы.

Аналогично многомерный вектор – это вектор векторов, т. е. вектор, элементами которого будут векторы.

/*Создание двумерного вектора (матрицы) целого типа при неизвестном количестве строк и столбцов*/

// Инициализация матрицы

int N, M;

cout<<”Введите число строк и столбцов”;

for(int i = 0; i < N; i++)

vector<int> vec; // Это строка-вектор

for(int j = 0; j < M; j++)

vec.push_back(i); // Заполняем очередную строку

dvec.push_back(vec); // Загружаем в матрицу очередную строку

Если количество строк N и количество столбцов M матрицы нам известны, то для создания матрицы надо использовать конструкцию

vector< vector<int> > matrix(N, vector<int>(M));

// Между двумя угловыми скобками обязательно должен быть пробел!

Инициализировать такую матрицу можно обычным способом:

for (int i=0; i<N; i++)

for ( int j=0; j<M; j++)

matrix[i][j]=rand()%5;

Таким образом, данная матрица состоит из N строк, а каждая строка – это вектор из M элементов, т. е. со строками матрицы можно работать как с обычными одномерными векторами, используя весь аппарат STL. Если вы будете вставлять в строку или удалять из нее элементы, то размер строки будет меняться.

Значит, в отличие от статических массивов в двумерном векторе (матрице) количество элементов в строках может быть разным.

Вектор может быть параметром функции и может возвращаться в виде результата работы функции.

Контейнеры STL всегда копируются при любых попытках передать их в качестве параметра.

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

void function(vector<int> v) < // Старайтесь никогда так не делать . >

Читать:
Nutscript gmod как сделать сервер

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

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

Если содержимое контейнера может измениться по ходу работы функции, то модификатор const писать не следует:

int (vector<int>& v) < // Так держать

Двумерный вектор, так же как и одномерный, передаются в функцию по ссылке.

void function(vector<vector<int> > &dvec)// Формальный параметр –

vector<int> vec; // Это вектор-строка

for(int j = 0; j < 5;j++)

vec.push_back(i); // Заполняем очередную строку

dvec.push_back(vec); // Заносим очередную строку в матрицу

Передать 2D-массив функции в качестве параметра в C

В этом посте будет обсуждаться, как передать 2D-массив функции в качестве параметра в C.

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

1. Для статического массива

Если мы знаем границы массива во время компиляции, мы можем передать статический 2D-массив функции на C, как показано ниже:

Как передать двумерный вектор функции на C ++?

Если он передается, он передается по значению или по ссылке?

3 ответы

Поскольку ваше объявление функции:

указывает указатель, по существу он передается по ссылке. Однако в C++ лучше избегать указателей и передавать ссылку напрямую:

Это похоже на обычный вызов функции, но он передается по ссылке, как указано в объявлении функции. Это избавит вас от ненужных разыменований указателя.

ответ дан 31 окт ’10, 00:10

Почему бы не передать только 2d-вектор?

ответ дан 17 авг.

Ну, во-первых, вы создаете это неправильно.

Вы можете передавать по значению или по ссылке, или по указателю (не рекомендуется). Если вы переходите к функции, которая не изменяет содержимое, вы можете передать ее по значению или по константной ссылке. Я бы предпочел ссылку на const, некоторые люди думают, что «правильный» способ — передать значение.

ответ дан 31 окт ’10, 00:10

Не забудьте пробел во вложенном шаблоне, т.е. vector<vector<int> > , иначе некоторые компиляторы будут жаловаться на недопустимые сдвиги вправо. — Касабланка

Я просто использую ваш комментарий в качестве примечания по этому поводу. Но есть ли соответствующие компиляторы, где это все еще проблема? — Бенджамин Линдли

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c++ vector 2d or задайте свой вопрос.

Related Posts