ссылки в цикле for
Объясните, пожалуйста, почему когда мы перебирают элементы из какого то массива таким циклом for
for(int& i : arr), то используют ссылку, а если перебирают символы в строке for(char c : str), то ссылку не используют? Ведь и там, и там массив, и, чтобы не расходовать много памяти, разумнее и там, и там использовать ссылку. В чем различие? Заранее спасибо
Ответы (1 шт):
Ну почему же?
for(int i : arr)
работает не только не хуже, но и, пожалуй, лучше - не требуется никаких разыменований etc.
Можно работать и так, и так. Работа со ссылкой означает, что где-то там за сценой получается адрес очередного элемента, и при работе с этим элементом выполняется разыменование. По значению - что выполняется копирование.
А потому надо смотреть, что именно вам нужно - например, если вы хотите изменять элементы в массиве, то нужно работать по ссылке. Если, наоборот, вы хотите изменять содержимое переменной цикла, но при этом хотите, чтобы это не отразилось на исходном контейнере - работайте по значению. Если ситуация допускает и тот, и иной вариант - стоит посмотреть, какая операция - разыменования (возможно, не одна) или копирования - обойдется дороже. Для простых типов небольшого размера копирование, как правило, дешевле. Но вообще говоря - тут надо даже не смотреть на конкретный код, а профилировать его - если, конечно, оно того стоит с точки зрения оптимизации.
И не забывайте, что можно использовать еще и константную ссылку :)