Когда я должен добавить амперсанд? у меня есть несколько примеров из моего hw:
Как следует определять возраст векторного параметра функции для следующих ситуаций?
1) возраст всегда будет небольшим (менее 10 элементов), и функция не будет изменять вектор. ОТВЕТ: Постоянно, но не передается по ссылке.
2) возраст всегда будет небольшим, и функция изменит вектор. ОТВЕТ: передать по ссылке, но не постоянно
Я понимаю непостоянную часть ... но не передачу по ссылке: / почему я добавляю амперсанд, чтобы он передавался по ссылке, а не по ссылке
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} } ) .
Для получения практических советов обычно следует просто передать копию, если:
* ваша функция хранит ссылку на переданный параметр или
* модифицируя его там, где необходимо наблюдать изменения после завершения функции
Передача по ссылке позволит функции изменять фактические данные аргумента - это означает, что любые изменения, происходящие внутри функции, будут сохраняться после того, как функция вернется.
Передача по значению означает, что функция работает с копией данных.
В некоторых ситуациях, например, если вы работаете с очень большими наборами данных, передача по значению может вызвать проблемы с производительностью, поскольку требуется скопировать так много данных (и в редких ситуациях, когда вы работаете с чрезвычайно ограниченной памятью, передача по значению может даже не быть вариантом.) В этих случаях вы должны передать ссылку const
, чтобы вам не приходилось давать функции ее собственную копию данных и функция не ' t изменить фактические передаваемые данные.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который будет скомпилирован с помощью компилятора C ++). Используйте тег, зависящий от версии, для вопросов, связанных с конкретной редакцией стандарта [C ++ 11], [C ++ 14], [C ++ 17] или [C ++ 20] и т. Д.