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

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

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

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

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

-4
aladco20 24 Окт 2018 в 03:22

2 ответа

Лучший ответ

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

Здесь говорится о том, что 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 (и эти изменения необходимо наблюдать после завершения функции), ссылка имеет больше смысла:

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, а затем вызвать наш исходный {{X3} } ) .

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

0
Tas 24 Окт 2018 в 00:50

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

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

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

1
ryanm 24 Окт 2018 в 00:49
52959483