когда я должен передать векторный параметр по ссылке, а не по значению? - PullRequest
0 голосов
/ 24 октября 2018

когда я должен добавить амперсанд?У меня есть несколько примеров из моего hw:

Как определить возраст векторных параметров функции для следующих ситуаций?

1) возраст всегда будет маленьким (менее 10 элементов) и функцияне будет изменять вектор.ОТВЕТ: Постоянный, но не проходящий по ссылке.

2) возраст всегда будет маленьким, и функция изменит вектор.ОТВЕТ: Передача по ссылке, но не константа

Я понимаю неконстантную часть ... но не передачу по ссылке: / почему я добавляю амперсанд, чтобы он проходил по ссылке, а не

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Это намного проще, чем предлагает ваша домашняя работа, но ради получения правильных оценок:

В нем говорится о том, насколько малым будет vector, потому что КОПИРОВАНИЕ большого вектора может быть дорогостоящим (производительностьмудрый).Если ваша функция не изменит vector, а vector будет небольшим, тогда достаточно просто передать копию.Примером может служить функция для печати vector:

void print(const std::vector<int> v) // const because we don't modify v
{
    for (auto i : v)
       std::cout << i << ", ";
}

Когда вместо этого у нас есть функция, которая должна изменить vector (и эти изменения необходимо наблюдать после завершения функции) aссылка имеет больше смысла:

void removeDuplicates(std::vector<int>& v)
{        
}

Здесь removeDuplicates принимает неконстантную ссылку, потому что она изменяет ее.Независимо от размера vector, мы ожидаем, что функция изменит переданный в vector:

std::vector<int> v;
// populate v
...
removeDuplicates(v);
// v may now be different

Если вместо этого у вас есть функция, которая изменяет аргументы, но эти изменения не должныесли смотреть за пределы функции, достаточно неконстантной копии.Представьте, что наша функция print напечатала элементы, округленные до ближайшего 100 (конечно, мы могли бы сделать это на лету, но мы могли бы сначала изменить vector, а затем вызвать наш оригинальный print).

Для получения реальных рекомендаций обычно следует просто передать копию, если:
* ваша функция не сохраняет ссылку на переданный параметр или
* изменяет ее, когда необходимо наблюдать изменения после завершения функции

0 голосов
/ 24 октября 2018

Передача по ссылке позволит функции изменять фактические данные аргумента - это означает, что любые изменения, происходящие внутри функции, будут сохраняться после возврата функции.

Передача по значению означает, чтоФункция работает с копией данных.

В некоторых ситуациях, например, если вы работаете с очень большими наборами данных, передача по значению может вызвать проблемы с производительностью, поскольку копируется слишком много данных (ив редких ситуациях, когда вы работаете с чрезвычайно ограниченной памятью, передача по значению может даже не быть вариантом.) В этих случаях вы должны проходить по ссылке const, чтобы вам не приходилось предоставлять функции собственную копиюданные и функция не изменяет фактические передаваемые данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...