Если вы хотите вернуть несколько элементов, вы можете использовать дополнительные выходные параметры в своих функциях (передаваемые по ссылке) или вернуть кортеж. Я предпочитаю более поздний вариант, так как это приводит к более читаемому коду.
Вместо ручного управления памятью ваших массивов с помощью new
и delete[]
, вы можете использовать std::vector
для достижения эквивалентного поведения. Каждый вектор хранит свой собственный размер, поэтому вам не нужно возвращать для этого дополнительную переменную.
Подводя итог, в этом случае вы можете просто вернуть кортеж из двух векторов. В стандартной библиотеке двухэлементные кортежи представлены классом std::pair
. Следовательно, ваша функция вернет пару векторов: std::pair<std::vector<int>, std::vector<int> >
. Так как это много для ввода, лучше использовать typedef
.
Это одна из возможных реализаций вашей функции. Обратите внимание, что вы можете избежать написания вручную циклов благодаря стандартному классу istream_iterator
:
typedef std::pair<std::vector<int>, std::vector<int> > Data;
Data read(std::ifstream & ifs)
{
int n;
ifs >> n;
typedef std::istream_iterator<int> in_it;
std::vector<int> a(n);
std::copy(in_it(ifs), in_it(), a.begin());
std::vector<int> b(n);
std::copy(in_it(ifs), in_it(), b.begin());
return Data(a, b);
}
И вот как бы вы использовали свою функцию. Обратите внимание, что вы не возвращаете размер неявным образом, но вы можете легко получить его с помощью std::vector::size()
.
int main() {
std::ifstream ifs("SOMEFILE.txt");
Data data = read(ifs);
unsigned int n = data.first.size();
std::vector<int> & a = data.first;
std::vector<int> & b = data.second;
return 0;
}
РЕДАКТИРОВАТЬ: Предложение Нила об использовании выделенного struct
лучше масштабируется и приводит к более читабельному коду, поэтому вам, безусловно, следует учитывать это. В этом случае ваша структура будет:
struct Data {
std::vector<int> a, b;
};
И ваша main
функция будет идентична, за исключением того, что вам придется заменить first
и second
на a
и b
.