Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Индекс элемента при выводе массива через диапазонный цикл for

#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 можно, но для этого надо изменить тип переменной: #include int 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"; } Который в принципе сработает для массивов или векторов (и то не уверен, гарантирует ли это стандарт), для многих контейнеров не подойдет - например, для хэш-таблиц порядок размещения вообще никак не определен, для множеств - они всегда упорядочены.

Комментариев нет:

Отправить комментарий