2017-01-06 2 views
1

У меня есть функция 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?

ответ

1

Действительно ли v фактически выделяется внутри myfun каждый раз, когда он называется?

Да

Если это произойдет, то, что происходит со старым против?

Он перезаписывается.

Кроме того, это лучше использовать просто использовать адрес, как пустота myfun (some_args, вектор & 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); 
    } 
} 
0

ли на самом деле выделяется v внутри myfun каждый раз, когда она называется?

Да

Если это произойдет, то, что происходит со старым против?

Когда v выходит из сферы действия, деструктор вызывается и объект разрушается. Вот почему вам не нужно явно вызывать деструктор класса.

Кроме того, это лучше использовать просто использовать адрес, как пустота myfun (some_args, вектор & v) для вывода аргументов против?

Это действительно зависит от вашего варианта использования. Если это связано с проблемами памяти, лучше передать ссылку.

Смежные вопросы