Использование ссылки на векторные элементы в диапазоне для - PullRequest
0 голосов
/ 23 апреля 2019

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

Код просто определяет вектор и инициализирует некоторые элементы, затем использует ранжирование для их возведения в квадрат и распечатывает выходные данные.

int main() {
        vector<int> v1{1,2,3,4,5};
        for (auto &i : v1)
                i *= i;
        for (auto i : v1)
                cout << i << " ";
        cout << endl;
}

Вышеуказанное работает, но если для первого ранжирования я использую:

for (auto i : v1)

элементы тогда не возводятся в квадрат. Какая здесь разница? Я не понимаю необходимости использовать ссылку в этом случае, но не позже, когда я захочу установить каждый элемент, используя другой ранжированный для.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Проще говоря:

for (auto i : v1) копирует значения в новую переменную.

for (auto &i : v1) ссылается на фактическое значение в векторе.

0 голосов
/ 23 апреля 2019
int i = 7; // i = 7
int j = i; // j = 7 (a copy of i)
j *= j; // j = 49 (but i, fortunately, is still 7)

И конечно:

int i = 7; // i = 7
auto j = i; // j = 7 (a copy of i)
j *= j; // j = 49 (but i is still 7)

И то же самое происходит в цикле на основе диапазона:

for (auto i : v) // i is a copy of an element of v
    i*= i; // you square the copy of the element of v, not the element itself
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...