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

Двумерный вектор в C++ Программирование и разработка

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

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

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

#include <iostream>

#include <vector>

#include <string>

using namespace std;

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

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

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

vector<string> store = {«bread», «meat», «rice», «Tomato sauce», «Cheese»};

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

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

return vtr;

}

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

vector<string> vtr

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

vector<string> vtr = store;

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

vector<string> store = {«bread», «meat», «rice», «tomato sauce», «Cheese»};

vector<string> 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 будет:

{«bread», «meat», «rice», «tomato sauce», «Cheese»}

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

vector<string> fn() {

return {«bread», «meat», «rice», «tomato sauce», «Cheese»};

}

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.

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

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

vector<string> store = {«bread», «meat», «rice», «tomato sauce», «Cheese»};

The variable, store here, is an ordinary name. Let the function of interest be:

vector<string> & fn(vector<string> &vtr) {

return vtr;

}

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

int main()

{

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

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

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

cout << endl;

return 0;

}

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

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

и

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

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

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

bread, meat, rice, tomato sauce, Cheese,

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

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

vector < string > store = { «хлеб», «мясо», «рис», «томатный соус», «сыр» } ;

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

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

return vtr ;

}

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

int main ( )

{

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

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

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

cout << конец ;

вернуть 0 ;

}

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

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

и

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

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

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

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

Заключение

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

Читайте также:  Оператор instanceof в Java
Оцените статью
bestprogrammer.ru
Добавить комментарий