我有一个函数myfun
,它将返回一个向量。
vector<double> myfun(const size_t k, const size_t i){
vector<double> v(k);
// do some computation with remaining arguments
return v;
}
然后,我会在循环中使用它来更新v
并使用v
来获得一些结果。
int main(){
size_t N = 100; // iteration size
size_t n = 10; // size of v
vector<double> result(N);
vector<double> v(n);
for(size_t i = 0; i<N; i++){
v = myfun(n,i); // compute for each iteration
result[i] = compute_some_value(v);
}
}
所以,我的问题是:
v
时myfun
是否实际分配了?{/ li>
v
会发生什么?void myfun(some_args, vector<double> &v)
之类的地址作为输出参数v
更好吗?答案 0 :(得分:1)
每次调用v时,v是否真的在myfun中分配了?
是
如果确实如此,老v会发生什么?
被覆盖。
另外,使用像myfun(some_args,vector&amp; v)这样的地址来输出参数v是否更好?
是的,最好根据您的操作按引用传递矢量。
你可以这样做
double compute_some_value(vector<double> & v, const size_t i) {
v.clear(); // use if required
// do some computation with remaining arguments and return
}
int main() {
size_t N = 100; // iteration size
size_t n = 10; // size of v
vector<double> result(N), v(n);
for (size_t i = 0; i < N; i++) {
result[i] = compute_some_value(v, i);
}
}
答案 1 :(得分:0)
每次调用v时,v是否真的在myfun中分配了?
是
如果确实如此,老v会发生什么?
当v超出范围时,将调用析构函数并且对象将被破坏。这就是为什么你不必显式调用类的析构函数。
另外,使用像myfun这样的地址更好(some_args, vector&amp; v)用于输出参数v?
这实际上取决于您的使用案例。如果它涉及内存问题,最好传递引用。