在循环中使用返回向量的函数

use function inside of loop which returns vector

本文关键字:向量 函数 返回 循环      更新时间:2023-10-16

我有一个函数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内部分配?
  • 如果是这样,旧v会怎样?
  • 另外,仅使用像void myfun(some_args, vector<double> &v)这样的地址作为输出参数v更好吗?

每次调用 myfun 时,v 实际上都会在 myfun 内部分配吗?

是的

如果是这样,旧v会怎样?

它被覆盖。

另外,对于输出参数 v,仅使用像 void myfun(some_args, vector &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);
    }
}

每次调用 myfun 时,v 实际上都会在 myfun 内部分配吗?

是的

如果是这样,旧v会怎样?

当 v 超出范围时,将调用析构函数,对象将析构。这就是为什么你实际上不必显式调用类的析构函数。

另外,是否最好只使用像void myfun(some_args这样的地址, 向量 &v) 用于输出参数 v?

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