Как работает диапазон на основе для простых массивов?
Это читать как " Скажите, что делает дальний поиск (с массивами)? "
Я отвечу, предполагая, что - Возьмем следующий пример с использованием вложенных массивов:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (auto &pl : ia)
Текстовая версия:
ia
- это массивмассивы («вложенный массив»), содержащие [3]
массивы, каждый из которых содержит [4]
значений.Приведенный выше пример проходит по ia
по его первичному «диапазону» ([3]
) и, следовательно, повторяет [3]
раз.Каждый цикл создает одно из [3]
*1021* первичных значений, начиная с первого и заканчивая последним. - Массив, содержащий [4]
значений.
- Первый цикл:
pl
равно {1,2,3,4}
- массив - второй цикл:
pl
равно {5,6,7,8}
- массив - третий цикл:
pl
равно {9,10,11,12}
- массив
Прежде чем мы объясним процесс, вот несколько дружественных напоминаний о массивах:
- Массивы интерпретируются как указатели на их первое значение - Использование массива без какой-либо итерации возвращает адрес первого значения
pl
должен быть ссылкой, потому что мы не можем копировать массивы - С массивами, когда вы добавляете число к самому объекту массива, он продвигается вперед много раз и 'указывает на эквивалентную запись - Если
n
является рассматриваемым числом, то ia[n]
совпадает с *(ia+n)
(Мы разыменовываем адрес, который n
записей вперед), а ia+n
такой жекак &ia[n]
(Мы получаем адресЭта запись в массиве).
Вот что происходит:
- В каждом цикле
pl
устанавливается как ссылка на ia[n]
, с n
равным счетчику токовой петли, начиная с 0. Итак, pl
равно ia[0]
в первом раунде, во втором - ia[1]
и так далее.Он получает значение с помощью итерации. - Цикл продолжается до тех пор, пока
ia+n
меньше end(ia)
.
... И это все.
Это просто упрощенный способ написать это :
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int n = 0; n != 3; ++n)
auto &pl = ia[n];
Если ваш массив не является вложенным, то этот процесс становитсянемного проще в том, что ссылка не необходима, потому что повторяемое значение является не массивом, а "нормальным" значением:
int ib[3] = {1,2,3};
// short
for (auto pl : ib)
cout << pl;
// long
for (int n = 0; n != 3; ++n)
cout << ib[n];
Некоторые дополнительныеинформация
Что если мы не хотим использовать ключевое слово auto
при создании pl
?Как это будет выглядеть?
В следующем примере pl
относится к array of four integers
.В каждом цикле pl
задается значение ia[n]
:
int ia[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for (int (&pl)[4] : ia)
И ... Вот как это работает, с дополнительной информацией, чтобы устранить любую путаницу.Это просто «сокращенная» петля for
, которая автоматически рассчитывает на вас, но не имеет способа извлечь текущий цикл, не делая это вручную.