On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 01.10.18 14:55. Заголовок: Доступ к элементам массивов.


Часто начинающие программисты, приступившие к изучению 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


Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 31
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет