在循环内部使用函数返回向量

时间:2017-01-06 11:37:45

标签: c++ function stdvector

我有一个函数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);
    }
}

所以,我的问题是:

  • 每次调用vmyfun是否实际分配了?{/ li>
  • 如果是,那么旧v会发生什么?
  • 另外,使用void myfun(some_args, vector<double> &v)之类的地址作为输出参数v更好吗?

2 个答案:

答案 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?

这实际上取决于您的使用案例。如果它涉及内存问题,最好传递引用。