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

от admin

Русские Блоги

When we pass an array to a function, a pointer is actually passed.

When a vectorпередается в функцию, создается копия вектора. Например, мы можем видеть программу ниже, изменения, сделанные внутри функции, не отражаются снаружи, потому что функция имеет копию. При передаче вектора в функцию создается копия вектора. Изменение вектора в функции не влияет на внешний вектор, потому что функция имеет копию.

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

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

This article is contributed by Kartik. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to [email protected] See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

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

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

3 ответы

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

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

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

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

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

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

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

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

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

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

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

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

передача вектора в функцию

В main() организован переключатель:
.
case 6:
<
double s=0;
int i;
for(i=0;i<v.size();i++)
s=s+v->Summ;
cout<<«\n\tОбщая сумма страховых взносов равна «<<s<<«\n»;
cout<<«\n\tСредняя сумма страховых взносов равна «<<s/i<<«\n»;
>
break;
Вопрос в том, как реализовать данный рассчёт, используя функцию(например CountSumm), которую потом вызвать в case 6?

6 ответов

[QUOTE=RainMan]Подскажите, как правильно передать вектор в функцию.
Есть класс:
class Person<

public:
.
double Summ;
.
>
вектор:
vector <Person*> v;
в котором хранятся ссылки на объекты класса

Функция, возвращающая вектор в C++

Программирование и разработка

Может ли функция возвращать вектор в С++? Причина, по которой задается этот вопрос, заключается в том, что функция не может возвращать массив (аналогичный вектору) в C++. Ответ прост. Да, функция может возвращать вектор в C++ и по-разному. В этой статье объясняются различные способы, которыми функция C++ может возвращать вектор.

Чтобы закодировать вектор на C++, в программу должна быть включена библиотека векторов. В векторной библиотеке есть векторный класс, из которого можно инстанцировать (создавать) векторные объекты.

Программа, в которой находятся все примеры кода этой статьи, начинается с:

Используется вектор строк.

Возврат вектора по нормальному имени вектора

Пусть интересующий вектор:

Вектор представляет собой список товаров в небольшом продуктовом магазине. Имя store этого вектора должно быть передано в качестве аргумента функции, параметром которой является вектор, но с именем vtr. Функция интереса может быть:

Обратите внимание на возвращаемый тип определения функции. Имя вектора store. Это аргумент для вызова функции. Параметр функции, соответствующей вектору:

Обратите внимание, что аргумент функции и имя параметра отличаются (могут быть одинаковыми). Как только функция начинает выполняться, делается следующий оператор:

Это утверждение эквивалентно следующим двум утверждениям:

Итак, vtr — это копия вектора, store. На данный момент в памяти программы есть два вектора с одинаковым содержимым. Подходящей основной функцией C++ для кода может быть:

int main ( )

<

vector < string > v = fn ( store ) ;

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

cout << v [ i ] << «, « ;

cout << endl ;

return 0 ;

>

Обратите внимание, что хранилище слов является аргументом вызова функции. При вызове функции в памяти появляются две копии одного и того же векторного содержимого. Функция (вызов) возвращает вектор, который получен другим вектором v. К моменту завершения программы в памяти имеется три вектора одной копии. Эти три копии одного и того же контента могут быть уменьшены до одной копии с помощью вектора ссылки или вектора указателя. Вывод для вышеуказанной программы:

Читать:
Какое соотношение символов и текста допустимо

bread, meat, rice, tomato sauce, Cheese.

Возврат векторного литерала

Сегодня (в 2022 году) векторный литерал — это то же самое, что и литерал массива. Этот литерал называется initializer_list сегодня в C++. Таким образом, возврат функции векторного литерала аналогичен возврату списка initializer_list. Пусть initlializer_list будет:

Пусть определение функции для возврата initializer_list будет следующим:

Initializer_list составляется на месте в операторе return и возвращается. Определение функции не имеет параметров, но имеет тот же тип возвращаемого значения, что и его аналог в предыдущем разделе. Пусть основной функцией C++ будет:

int main ( )

<

vector < string > v = fn ( ) ;

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

cout << v [ i ] << «, « ;

cout << endl ;

return 0 ;

>

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

К моменту завершения программы будут ли в памяти две копии одного и того же вектора? Нет. Будет только одна копия — v. Initializer_list — это своего рода выражение, называемое rvalue. Когда такое выражение больше не требуется в памяти, может ли C++ стереть его, чтобы освободить место в памяти? Неважно, остается ли он в памяти после того, как был использован, пока программа продолжает работать. Он будет стерт, если его пространство необходимо. Вывод программы:

bread, meat, rice, tomato sauce, Cheese.

Возврат ссылки на вектор

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

Обратите внимание на наличие и положение & в параметре. Это означает, что vtr является ссылочным (синонимным) вектором, а не копией отправляемого аргумента. Обратите внимание на наличие и положение & в возвращаемом типе. Это означает, что ссылка (синоним) вектора будет возвращена функцией. Обратите внимание, что внутренний оператор «return vtr;» не имеет &. Пусть основная функция C++ будет:

int main ( )

<

vector < string > * v = & fn ( store ) ;

for ( int i = 0 ; i < v -> size ( ) ; i ++ )

cout << ( * v ) [ i ] << «, « ;

cout << endl ;

return 0 ;

>

Сигнатура определения функции и оператор вызова функции:

соответственно. Обратите внимание еще раз на наличие и положение & в возвращаемом типе определения функции. Обратите внимание на наличие и положение & в операторе вызова функции. Аргументом вызова функции является обычное имя вектора store. Функция возвращает ссылку, а ее получает указатель v.

Итак, в программе есть три разные переменные, ссылающиеся на одну и ту же ячейку векторной памяти (функция вернула &vtr, что является синонимом store). Результат:

Возврат векторного указателя

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

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

vector < string > * fn ( vector < string > * vtr ) <

Обратите внимание на наличие и положение * в параметре. Это означает, что vtr является вектором указателя, а не копией какого-либо векторного аргумента для отправки. Обратите внимание на наличие и положение * в возвращаемом типе. Опять же, обратите внимание, что внутренний оператор «return vtr;» не имеет & или *. Пусть основная функция C++ будет:

vector < string > * v = fn ( & store ) ;

for ( int i = 0 ; i < v -> size ( ) ; i ++ )

Сигнатура определения функции и оператор вызова функции:

вектор < строка > * fn ( вектор < строка > * vtr )

vector < string > * v = fn ( & store ) ;

соответственно. Обратите внимание на наличие и положение * в возвращаемом типе определения функции. Обратите внимание на наличие и положение & в операторе вызова функции; он стоит перед аргументом store, а не перед fn(), у которого нет & или *. Функция возвращает ссылку, а ее получает указатель v.

Итак, в программе есть три разные переменные, ссылающиеся на одну и ту же ячейку векторной памяти. Результат:

хлеб, мясо, рис, томатный соус, Сыр,

Заключение

Функция может возвращать вектор по его нормальному имени. Функция может возвращать векторный литерал (initializer_list), который будет получен обычным вектором (имя). Вектор может возвращать ссылку на вектор, которая будет получена указателем вектора. Вектор может возвращать указатель вектора, который все еще должен быть получен другим указателем вектора.

Похожие статьи