Итераторы в C ++ начинаются / заканчиваются против: коллекции - PullRequest
0 голосов
/ 30 января 2019

Может ли кто-нибудь объяснить мне разницу между

for( auto a : world )

и

for( auto a=world.begin() ; a != world.end(); a++ )

делает первый (глубокий)копия вектора / массива [мир]?Если a изменяется внутри цикла, изменения кажутся потерянными в первом и сохраняются во втором.

TIA Richard

Ответы [ 2 ]

0 голосов
/ 30 января 2019
for( auto a : world ) { ...something... }

примерно эквивалентно

for( auto it = world.begin(); it != world.end(); ++it ) {
    auto a = *it;
    { ...something... } }

, поэтому a - это копия значения из итератора, и его изменение не повлияет на коллекцию, из которой оно было скопировано.

0 голосов
/ 30 января 2019

Нет, первый цикл не делает глубокую копию world в целом, , но на каждой итерации, элемент из world копируется в a.

Если вы хотите внести изменения в a и сделать так, чтобы они влияли на исходную коллекцию, вы обычно хотите объявить a в качестве ссылки:

std::vector<int> world;

// add 2 to each item in `world`:
for( auto &a : world )
    a += 2;

В этом случае a - этоссылка на элемент в world, поэтому добавление к нему изменяет элемент в world.

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