Страницы

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

четверг, 4 октября 2018 г.

Как перебрать массив элементов, не зная его размеров?

char peremen_t[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
Мне нужно вывести все элементы массива. Я понимаю, что для этого нужен цикл:
for (int i = 0; i < 10; i++) { qDebug() <<"peremen_t[i] " << peremen_t[i]; }
А что если добавить несколько элементов, скажем так:
char peremen_t[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 101, 102, 103};
То как перебирать все эти элементы, постоянно менять условие i < ...? Вот собственно вопрос: как перебирать массив элементов, не зная сколько там элементов? :)


Ответ

Имеется несколько подходов. Во первых размер массива можно вычислить по формуле sizeof( массива ) / sizeof( элемента массива ). Например
for ( size_t i = 0; i < sizeof( peremen_t ) / sizeof( *peremen_t ); i++ ) { qDebug() <<"peremen_t[i] " << peremen_t[i]; }
Во-вторых, вы можете использовать цикл for на основе диапазона. Если вам при этом нужен индекс элемента, то вы можете определить его до цикла. Например,
size_t i = 0; for ( auto x : peremen_t ) { qDebug() <<"peremen_t[" << i << "] " << x; ++i; }
Также вы можете использовать цикл с итераторами. Например,
#include
// ...
size_t i = 0; for ( auto it = std::begin( peremen_t ); it != std::end( peremen_t ); ++it, ++i ) { qDebug() <<"peremen_t[" << i << "] " << *it; }
И, наконец, вы можете написать шаблонную функцию, которая выполняет требуемую задачу. Например,
template inline void f( const T ( &peremen_t )[N] ) { for ( size_t i = 0; i < N; i++ ) { qDebug() <<"peremen_t[i] " << peremen_t[i]; } }
Кроме того вы можете использовать какое-нибудь граничное значение в массиве. Например, для символьных массивов это может быть '\0' при условии, что действительные элементы массива не могут содержать этот символ, или какое-нибудь другое уникальное значение. Например,
char peremen_t[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 0 }; // ^^^ for ( size_t i = 0; permen_t[i] != '\0'; i++ ) { qDebug() <<"peremen_t[i] " << peremen_t[i]; }

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

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