int ThreeRowsThreeColumns [3][3] = {{-501, 206, 2011}, {989, 101, 206}, {303, 456, 596}};
Он инициализирован способом, который можно рассматривать как три массива, каждый из которых содержит три целых числа. Здесь целочисленный элемент со значе нием 206 находится в позиции [0][1], а элемент со значением 456 — в позиции [2][2].
80 ЗАНЯТИЕ 4. Массивы и строки
Листинг 4.3 демонстрирует, как можно обращаться к целочисленным элементам в этом массиве.
ЛИСТИНГ 4,3. Доступ к элементам в многомерном м ассиве ____________________________
#include
using namespace std;
3
|
int main()
|
|
|
|
|
|
|
|
л
|
i
|
|
|
|
|
|
|
|
|
н
|
ThreeRowsThreeColumns
|
[3][3] = \
|
|
|
|
5
|
int
|
456 , 596}};
|
6
|
{{—501,
|
206,
|
2011},
|
•(989,
|
101, 206}, {303,
|
п
|
|
|
|
|
|
|
|
|
|
1
|
cout
|
«
|
"Row
|
0: "«
|
ThreeRowsThreeColumns
|
[0] [0]
|
«
|
ft " \
|
8
|
9
|
|
|
|
«
|
ThreeRowsThreeColumns
|
[0] [1]
|
«
|
v " \
|
10
|
|
|
|
«
|
ThreeRowsThreeColumns
|
[0] [2]
|
«
|
endl;
|
11
|
|
|
|
|
|
|
|
|
|
12
|
cout
|
<< "Row
|
1: "«
|
ThreeRowsThreeColumns
|
[1] [0]
|
«
|
VI"\
|
13
|
14
|
|
|
|
«
|
ThreeRowsThreeColumns
|
[1] [1]
|
«
|
If " \
|
15
|
|
|
|
«
|
ThreeRowsThreeColumns
|
[1] [2]
|
«
|
endl;
|
16
|
cout
|
«
|
"Row
|
2: "«
|
ThreeRowsThreeColumns
|
[2] [0]
|
«
|
IV "\
|
17
|
18
|
|
|
|
«
|
ThreeRowsThreeColumns
|
[2] [1]
|
«
|
VI" \
|
19
|
|
|
|
«
|
ThreeRowsThreeColumns
|
[2] [2]
|
«
|
endl;
|
20
|
|
|
|
|
|
|
|
|
|
return 0;
}
Результат
Row 0: -501 206 2011
Row 1: 989 101 206
Row 2: 303 456 596
Анализ
Обратите внимание на способ обращения к элементам в построчном массиве, начи нающемся с массива Row 0 (первый ряд с индексом 0) и заканчивающимся массивом Row 2 (третий ряд с индексом 2). Поскольку каждый из рядов — это массив, синтаксис для обращения к третьему элементу в первом ряду такой, как в строке 10.
ПРИМЕЧАНИЕ
Длина кода в листинге 4.3 существенно увеличивается при увеличении количе ства элементов в массиве или его размерностей. Фактически в профессиональ ной среде разработки такой код неприменим.
Более эффективный способ обращения к элементам многомерного массива приведен в листинге 6.14 занятия 6, “Ветвление процесса выполнения про грамм”. Там для доступа ко всем элементам подобного массива используется вложенный цикл for. Код с применением цикла for существенно короче и меньше склонен к ошибкам, а кроме того, на его длину не влияет изменение количества элементов в массиве.
Динамические массивы
Рассмотрим приложение, которое хранит медицинские записи больницы. Програм мист никак не может заранее знать, сколько записей должно хранить и обрабатывать его приложение. Он может сделать предположение о разумном пределе количества записей для маленькой больницы, превышение которого маловероятно. В этом случае он бес смысленно резервирует огромные объемы памяти и уменьшает производительность сис темы.
таком случае нужно использовать не статические массивы, которые мы рассмотрели только что, а динамические, которые оптимизируют использование памяти и при необ ходимости увеличивают размер занимаемых ими ресурсов и памяти во время выполне ния. Язык C++ предоставляет очень удобный в работе динамический массив в форме типа s t d : : v ecto r, как показано в листинге 4.4.
ЛИСТИНГ 4,4. Создание динамического массива целых чисел и заполнение его значениями
#include
#include
:
using namespace std;
int main()
6 : {
vector DynArrNums (3);
:
DynArrNums[0] = 365;
DynArrNums[1] = -421;
DynArrNums[2]= 789;
1 2 :
13: cout « "Number of integers in array: " « DynArrNums.size()
endl;
14:
cout « "Enter another number for the array" « endl;
int AnotherNum = 0;
cin » AnotherNum;
DynArrNums.push_back(AnotherNum);
19:
20: cout « "Number of integers in array: " « DynArrNums.size()
endl;
cout « "Last element in array: ";
cout « DynArrNums[DynArrNums.size() - 1] « endl;
return 0;
}
Результат
Number of integers in array: 3
Enter another number for the array
2011
Number of integers in array: 4
Last element in array: 2011
82 ЗАНЯТИЕ 4. Массивы и строки
Анализ
Не волнуйтесь о синтаксисе векторов и шаблонов в листинге 4.4, — они пока еще не были объяснены. Попробуйте посмотреть вывод и соотнести его с кодом. Согласно вы воду, начальный размер массива составляет три элемента, что согласуется с объявлением вектора в строке 7. Зная это, вы все же можете в строке 15 попросить пользователя вве сти четвертое число и, что интересней всего, в строке 18 можете добавить его в вектор, используя метод p u s h b a c k (). Вектор динамически изменит свои размеры так, чтобы приспособиться к хранению большего объема данных. Это заметно по последую щ ему увеличению размера массива до 4. Обратите внимание на использование знакомого по статическому массиву синтаксиса доступа к данным в векторе. В строке 22 осущ ествля ется доступ к последнему элементу (каким бы он ни был по счету, поскольку его позиция вычисляется во время выполнения) при помощи индекса, который для последнего элемен та имеет значение р азм е р - 1, а метод s i z e () как раз и возвращает общее количество элементов вектора.
ПРИМЕЧАНИЕ
Для использования класса динамического массива std:: ector в код необ ходимо включить заголовок vector, как это сделано в строке 1 листинга 4.4.
#include
Более подробная информация о векторах приведена на занятии 17, “Классы динамических массивов библиотеки STL".
Строки в стиле С
Строки в стиле С (C-style string) — это частный случай массива символов. Вы уже
видели несколько примеров таких строк в виде строковых литералов, когда писали такой
код:
std::cout << "Hello World";
Это эквивалентно такому объявлению массива:
char SayHello[] = {'Н', 'е', '1*, '1', 'о', '
'W', 'o', 'г', '1*, 'd', '\0'};
std::cout << SayHello << std::endl;
Обратите внимание: последний символ в массиве — нулевой символ ' \ 0 '. Он также называется знаком окончания строки (string-term inating character), поскольку указывает компилятору, что строка закончилась. Такие строки в стиле С — это частный случай сим вольных массивов, последним символом которых всегда является нулевой символ ' \ 0 *. Когда вы используете в коде строковый литерал, компилятор сам добавляет после него символ ' \ 0 '.
Если вставить символ ' \ 0 ' в середину массива, то это не изменит его размер; однако обработка строки, хранящейся в данном массиве, остановится на этой точке. Это демон стрирует листинг 4.5.
ПРИМЕЧАНИЕ
Символ ' \0 ' может показаться двумя символами, и, в самом деле, для его ввода следует нажать на клавиатуре две клавиши. Однако обратная косая чер
та - это специальный управляющий код, который компилятор понимает и вос принимает \0 как нуль, т.е. это способ указать компилятору вставить нулевой символ или нуль.
Вы не можете ввести нулевой символ непосредственно, поскольку литерал ' 0 ' будет воспринят как символьный нуль с кодом ASCII 48, а не 0.
Чтобы увидеть этот и другие значения кодов ASCII, обратитесь к таблице в при ложении Д, “Коды ASCII”.
ЛИСТИНГ 4.5. Анализ завершающейся нулем строки в стиле С
#include
using namespace std;
Do'stlaringiz bilan baham: |