Часто начинающие программисты, приступившие к изучению C++, сталкиваются с проблемой, как определить число элементов в массиве, например, при использовании цикла для вывода элементов массива на консоль.
Проще говоря, как последовательно обратиться к элементам массива.
Вот один из таких вопросов начинающего программиста на Stackoverflow
What is the recommended way loop through an array in C++? В таких языках, как, например, Java, JavaScript, C# и других, подобных им языках, имеются члены или методы такие, как length, Length, length() и т.п. , которые позволяют легко получить число элементов в массиве, так как массивы в таких языках определяются в виде классов или объектов
К примеру в C# можно вывести элементы на консоль следующими способами
using System;
public class Test
{
public static void Main()
{
int[] shoppingList = { 1, 2, 3 };
for ( int i = 0, n = shoppingList.Length; i < n; i++ )
{
Console.WriteLine( shoppingList );
}
Console.WriteLine();
foreach( int item in shoppingList )
{
Console.WriteLine( item );
}
}
}
Вывод программы на консоль будет
1
2
3
1
2
3
В C++ массивы не являются объектами классов, поэтому у них нет таких членов класса или методов, которые позволяют получить количество элементов в массиве.
Однако получить такое значение достаточно просто. Самый простой способ - это использовать оператор
sizeof. Например,
sizeof( shoppingList ) / sizeof( *shoppingList ). Чтобы не писать такое длинное выражение, можно использовать стандартную функцию
std::size, которая появилась с принятием стандарта C++ 17. Например,
std::size( shoppingList ).
Также можно использовать конструкцию
std::extent_v<decltype( shoppingList )>.
Альтернативные подходы - это использовать итераторы с помощью стандартных функций std::begin, std;:end и подобные им, а также можно использовать стандартные алгоритмы.
Ниже приведена демонстрационная программа, в которой показаны описанные подходы к обращению к элементам массива для вывода их на консоль.
#include <iostream>
#include <iterator>
#include <type_traits>
int main()
{
int shoppingList[] = { 1, 2, 3 };
for ( size_t i = 0; i < sizeof( shoppingList ) / sizeof( *shoppingList ); i++ )
{
std::cout << shoppingList << '\n';
}
std::cout << '\n';
for ( size_t i = 0; i < std::size( shoppingList ); i++ )
{
std::cout << shoppingList << '\n';
}
std::cout << '\n';
for ( size_t i = 0, n = std::extent_v<decltype( shoppingList )>; i < n; i++ )
{
std::cout << shoppingList << '\n';
}
std::cout << '\n';
for ( auto first = std::begin( shoppingList ), last = std::end( shoppingList ); first != last; ++first )
{
std::cout << *first << '\n';
}
std::cout << '\n';
std::for_each( std::begin( shoppingList ), std::end( shoppingList ),
[]( const auto &item ) { std::cout << item << '\n'; } );
std::cout << '\n';
std::copy( std::begin( shoppingList ), std::end( shoppingList ),
std::ostream_iterator<int>( std::cout, "\n" ) );
std::cout << '\n';
}
Вывод программы на консоль
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3