Ваш вопрос по сути "Как мне вернуть кучу вещей из функции?" Бывает, что ваши вещи являются vector<double>
, но это не очень важно. Важно то, что у вас есть куча их неизвестного размера.
Вы можете улучшить свое мышление, перефразировав один вопрос на два:
- Как мне представить кучу вещей ?
- Как мне вернуть это представление из функции?
Что касается первого вопроса, это именно то, что делают контейнеры . Контейнеры, как вы наверняка знаете, потому что вы уже используете один, содержат произвольное количество похожих объектов. Примеры включают в себя std::vector<T>
и std::list<T>
, среди других. Выбор того, какой контейнер использовать, продиктован обстоятельствами, которые вы не упомянули - например, насколько дорогими являются элементы для копирования, нужно ли удалять элемент из середины стопки и т. Д.
В вашем конкретном случае, зная, что мало мы знаем, кажется, вы должны использовать std::vector<>
. Как вы знаете, параметр шаблона - это тип того, что вы хотите сохранить. В вашем случае это (по совпадению) std::vector<double>
. (Тот факт, что контейнер и содержащийся в нем объект похожи, не имеет значения. Если вам нужна куча BLOB-объектов или виджетов, вы говорите std::vector<Blob>
или std::vector<Widget>
. Поскольку вам нужна куча vector<double>
с , вы говорите vector<vector<double> >
.) Таким образом, вы объявите это так:
std::vector<std::vector<double > > myPile;
(Обратите внимание на пробел между >
и >
. Этот пробел требуется в предыдущем стандарте C ++.)
Вы строите этот вектор так же, как и свой vector<double>
- либо с использованием универсальных алгоритмов, либо вызывая push_back
, либо другим способом. Итак, ваш код будет выглядеть так:
void function( /* args */ ) {
std::vector<std::vector<double> > myPile;
while( /* some condition */ ) {
std::vector<double> oneLineOfData;
/* code to read in one vector */
myPile.push_back(oneLineOfData);
}
}
Таким образом, вы собираете все входящие данные в одну структуру, myPile
.
Что касается второго вопроса, как вернуть данные. Ну, это просто - используйте оператор return
.
std::vector<std::vector<double> > function( /* args */ ) {
std::vector<std::vector<double> > myPile;
/* All of the useful code goes here*/
return myPile;
}
Конечно, вы также можете вернуть информацию через переданную ссылку на ваш вектор:
void function( /* args */, std::vector<std::vector<double> >& myPile)
{
/* code goes here. including: */
myPile.push_back(oneLineOfData);
}
Или через переданный указатель на ваш вектор:
void function( /* args */, std::vector<std::vector<double> >* myPile)
{
/* code goes here. */
myPile->push_back(oneLineOfData);
}
В обоих случаях вызывающая сторона должна создать вектор-вектор-двойник перед вызовом вашей функции. Предпочитаю первый (return
) способ, но если ваш дизайн программы диктует, вы можете использовать другие способы.