#cpp #cpp11
У меня есть простейший Range-based цикл: int arr[3] = { 9, 7, 1 }; for (auto i: arr) std::cout << i << "\n"; Программа выведет на экран содержимое массива: 9 7 1 А если я хочу вывести на экран более подробную информацию: массив[0] = 9 массив[1] = 7 массив[2] = 1 Как мне обойтись без введения дополнительной переменной-счетчика? или это невозможно?
Ответы
Ответ 1
Получить индекс элемента внутри range-for можно, но для этого надо изменить тип переменной: #includeint main() { int arr[3] = { 9, 7, 1 }; for (auto& v: arr) std::cout << (&v - &arr[0]) << "-" << v << "\n"; } Вывод: 0-9 1-7 2-1 Здесь мы добавили & к auto, чтобы тип итерируемой переменной был int&. Т.о. переменная цикла это не новая копия, а ссылка на элемент массива. И т.к. элементы массива расположены в памяти последовательно, то выражение (&v - &arr[0]) в данном случае будет давать смещение элемента от начала массива, т.е. по сути необходимый Вам индекс. Можно заметить, что дополнительную переменную вводить для этого не пришлось, как утверждали другие участники. Ответ 2
Очевидно, в этом предложении for (auto i: arr) std::cout << "i" << "\n"; ^^^^ вы допустили опечатку. Скорей всего вы имели в виду for (auto i: arr) std::cout << i << "\n"; ^^^^ Что касается вашего вопроса, то чтобы дополнительно к значениям элементов массива получить значения индексов элементов массива, вам в любом случае придется вводить дополнительную переменную. Поэтому в таких случаях лучше использовать обычное for предложение. for ( size_t i = 0; i < sizeof( arr ) / sizeof( *arr ); i++ ) { std::cout << arr[i] << "\n"; } Циклы на основе диапазона для того и введены, чтобы освободиться от переменной, которая обычно при выводе значений массива не нужна. Использование переменной для хранения индексов часто является причиной многочисленных ошибок либо когда индексирование начинают не с 0, а, например, с 1, или когда указывают неправильно верхнее значение диапазона индексов.Ответ 3
В дополнение к и так полному ответу @Vlad from Moscow - на случай использования других контейнеров учтите, что понятие индексов применимо не ко всем контейнерам. Так что способ вывода, например, int arr[3] = { 9, 7, 1 }; int i = 0; for (auto n: arr) { std::cout << "arr[" << i++ << "] = " << n << "\n"; } Который в принципе сработает для массивов или векторов (и то не уверен, гарантирует ли это стандарт), для многих контейнеров не подойдет - например, для хэш-таблиц порядок размещения вообще никак не определен, для множеств - они всегда упорядочены.
Комментариев нет:
Отправить комментарий