Проблемы с возвращением значения вектора
По ходу процесса в функции, которая используется в main.cpp и которая принимает этот вектор как параметр, происходит заполнение этого вектора.
Но при выходе из функции вектор остаётся пустым.
Почему?
#include <iostream>
#include <vector>
using namespace std;
void func(vector<int> &vec);
int _tmain(int argc, _TCHAR* argv[])
{
int size = 10;
vector<int> vec(size);// заполнен 0
func(vec);
cout<<endl;
for(int i = 0;i<10;++i)
cout<<vec<<' ';
cout<<endl;
return 0;
}
void func(vector<int> &vec)
{
for(int i = 0;i<vec.size();++i)
vec = i;
}
Вектор в ф-ию лучше передавать по ссылке,поскольку при передаче по
значению вектор со всеми элементами копируется в стек вызванной
ф-ии,что неэффективно.Если передашь по значению вектор останется
заполненный 0.
Вектор в ф-ию лучше передавать по ссылке,поскольку при передаче по
значению вектор со всеми элементами копируется в стек вызванной
ф-ии,что неэффективно.Если передашь по значению вектор останется
заполненный 0.
Совершенно верно, но только хотел бы уточить - не лучше по ссылке, а необходимо по ссылке:). В зависимости от логики, можно так же создавать вектор внутри функции и возвращать его.
Долго и накладно. Для входящих значений "тяжёлых" контейнеров нужно передавать константную ссылку на объект, а для исходящих - изменяемую.
Передавать сами объекты имеет смысл только когда входящий массив изменяется внутри функции для получения требуемого результата
В принципе, согласен, только есть некоторые неясные мне моменты.
1) "Тяжесть" контейнера определяешь на глаз? Экспериментально?
2) Насчет изменяемой ссылки - так тогда, если я тебя правильно понял, перед вызовом надо проверить существование корректного вектора, если надо, отслеживать возможные изменения его функцией, хотя бы на предмет исключений, в общем - логика вызываюшей стороны связывается еще больше с внутренней логикой функции. Это не есть хорошо, думаю:), особенно учитывая, что по философии STL корректность аргументов обеспечивается вызывающей стороной.. И для, так сказать, лучшей масштабируемости, иногда стоит пренебречь этой возможностью.
По второму пункту - что означает этот набор фраз? Любой "контейнер" - это объект, который обязан сам обеспечивать всю рутину по работе с вложенной информацией.
По второму пункту - что означает этот набор фраз? Любой "контейнер" - это объект, который обязан сам обеспечивать всю рутину по работе с вложенной информацией.
Я имел в вижу следующее - читаем твой пост:
Долго и накладно. Для входящих значений "тяжёлых" контейнеров нужно передавать константную ссылку на объект, а для исходящих - изменяемую.
Мои вопросы как раз взаимосвязны -
В зависимости от логики, можно так же создавать вектор внутри функции и возвращать его.
Конечно, для тяжелого контейнера передавать его по значению накладно. Но для "легких" и средних - нормально:)
Пусть теперь мы передаем изменяемую ссылку, чтобы туда что-то запихнуть в теле функции. С точки зрения производительности - выгоднее передавать по ссылке. Но тогда эту ссылку надо будет передавать функции, чего можно было бы избежать, если контейнер создавать в теле функции (статически), и вернуть. И функция принимает одним параметром меньше:).
Конечно, для тяжелого контейнера передавать его по значению накладно. Но для "легких" и средних - нормально:)
Теперь я задам всё тот же вопрос: как вы определяете "тяжесть контейнера"?
Есть одно золотое правило (за невыполнение которого, бью по рукам): ЛЮБЫЕ ОБЪЕКТЫ передаются по константной ссылке, а не по значению.
Пусть теперь мы передаем изменяемую ссылку, чтобы туда что-то запихнуть в теле функции. С точки зрения производительности - выгоднее передавать по ссылке. Но тогда эту ссылку надо будет передавать функции, чего можно было бы избежать, если контейнер создавать в теле функции (статически), и вернуть. И функция принимает одним параметром меньше:).
Принимает одним параметром меньше, головной боли в десять раз больше.
Ещё одно правило: не возвращайте из функций ссылки на статические переменные, замучаетесь отлавливать ошибки (а в многопоточных приложениях вообще не отловите).
Кроме того, как думаешь, что накладнее с точки производительности: передать один параметр или сконструировать объект?
Я первый спросил:) Ну вот скажем, 1000 int- значений вектор, исключительно для примера. Это какой? С точки зрения потерь производительности. Понятно, что это очень относительное понятие, но все же?
не возвращайте из функций ссылки на статические переменные, замучаетесь отлавливать ошибки (а в многопоточных приложениях вообще не отловите).
Согласен:).
Но я, во-первых, не имел в виду многопоточные приложения, когда говорил. Во-вторых - я как раз не призываю возвращать из функции такии ссылки. Где ты это увидел в моем посте?
Кроме того, как думаешь, что накладнее с точки производительности: передать один параметр или сконструировать объект?
Я знаю, о чем тут и сказал. -
Я не из-за производительности я начал спор - понятно, что передача по значению проигрывает. А про то, что такая, как ты говоришь, функция больше от вызыв. кода зависит.