Массивы и связные списки. Массивы и связанные списки. В предыдущих главах переменные типа int и char
Скачать 287.28 Kb.
|
коллекция (collection) – элементы упорядочены и отсортированы в определен- ном порядке; набор (set) – ни один из элементов не повторяется; словарь (dictionary) – набор соответствующих друг другу пар элементов, в кото- рых значение одного из них можно получить из значения другого; разреженный массив (sparse array) – разрешены индексы любой величины, но память занимают только те значения, которые содержатся в массиве; таким об- разом, можно обратиться и к элементу SparseArray[5] , и к элементу SparseArray[200] , но память будет выделена только для пятого элемента; мешок (bag), или мультимножество, – неупорядоченный набор элементов, до- бавлять и обращаться к которым можно в произвольном порядке. Перегрузив оператор индексирования ( [] ), можно преобразовать связанный спи- сок в коллекцию. Исключив дублирование элементов, можно преобразовать коллек- цию в набор. Если каждый объект списка имеет пару значений, его можно использо- вать для создания словаря или разреженного массива. ???? ???? ??????????? ????? ??????? ? ????????????? ????????? ???* ????????, ????????????? ??????????? ???????????? ?????????? ??* ?????? ???????, ??? ???????, ??? ?? ???????. ?????? Сегодня рассматривалось создание массивов в языке C++. Массив – это набор строго фиксированного количества однотипных элементов. Массивы не проверяют свой размер. Поэтому возможна ситуация, когда элемент записывается за пределами области памяти, выделенной для массива. Обычно это приводит к катастрофе. Массивы начинаются с 0 . Частой ошибкой является попытка записи элемента номер n в массив из n элементов. Массивы могут быть одно- или многомерными. В любом случае элементы массива могут быть инициализированы при создании, вне зависимости от того, содержит ли он встроенные типы (такие, как int ) или объекты класса, располагающего стандарт- ным конструктором. Массивы и их содержимое могут быть размещены как в динамической памяти, так и в стеке. При удалении массивов, размещенных в динамической памяти, не забывай- те использовать квадратные скобки в операторе delete[] Имя массива представляет собой постоянный указатель на его первый элемент. Указатели и массивы используют арифметические операции над указателями для по- иска необходимого элемента массива. 388 ?????? 2. ???????? ??????? Строки – это разновидность массива символов. Язык C++ обладает специальны- ми средствами для работы с символьными массивами, включая возможность инициа- лизировать их с помощью строки, заключенной в парные кавычки. ??????? ? ?????? Что находится в неинициализированном элементе массива? Любое значение, находившееся в этой области памяти ранее. Результаты ис- пользования неинициализированного элемента непредсказуемы. Если компиля- тор соответствует стандарту C++, то элементы массива, не являющиеся стати- ческими или локальными объектами, будут инициализированы нулем. Можно ли объединять массивы? Да. Чтобы объединить массивы, необходимо использовать указатели. Объеди- нять строки еще проще: для них можно использовать встроенные функции, на- пример, strcat() Зачем создавать связанный список, если можно использовать массив? Массив имеет фиксированный размер, в то время как связанный список спосо- бен динамически изменять свой размер в процессе выполнения программы. Более подробная информация о связанных списках приведена в приложении Д, “Связанные списки”. Зачем использовать встроенные массивы, если класс массива работает лучше? Применение встроенных массивов проще и быстрее. Должен ли класс String использовать указатель char * , чтобы хранить содер- жимое строки? Нет. Для хранения можно использовать любой тип памяти. Выбирать нужно тот, который подходит наиболее. ?????????? В этом разделе предлагаются вопросы для самоконтроля и закрепления получен- ных знаний, а также упражнения, которые помогут применить изученное на практи- ке. Попытайтесь самостоятельно ответить на вопросы и выполнить все задания и только потом сверьте полученные результаты с ответами в приложении Г, “Ответы”. Не приступайте к изучению материала следующей главы, если остались неясными хо- тя бы некоторые из предложенных ниже вопросов. ??????????? ??????? 1. Какой из элементов массива SomeArray[25] будет первым, а какой – последним? 2. Как объявить многомерный массив? 3. Инициализируйте элементы массива из вопроса 2. 4. Сколько элементов содержит массив SomeArray[10][5][20] ? 5. Чем связанный список отличается от массива? 6. Сколько символов хранится в строке “ Jesse knows C++ ”? 7. Каким будет последний символ в строке “ Brad is a nice guy ”? ???? 13. ??????? ? ????????? ?????? 389 ?????????? 1. Объявите двумерный массив, представляющий поле для игры в крестики-нолики. 2. Напишите код, инициализирующий значением 0 все элементы массива упраж- нения 1. 3. Напишите программу, которая содержит четыре массива. Три первых массива должны содержать имена, инициалы и фамилии. Используя изученную на сего- дняшнем уроке функцию копирования строк, организуйте конкатенацию и ко- пирование их строк в четвертый массив, содержащий полные имена. 4. Отладка. Найдите ошибку в следующем фрагменте кода: unsigned short SomeArray[5][4]; for (int i=0; i<4; i++) for (int j=0; j<5; j++) SomeArray[i][j] = i+j; 5. Отладка. Найдите ошибку в следующем фрагменте кода: unsigned short SomeArray[5][4]; for (int i=0; i<=5; i++) for (int j=0; j<=4; j++) SomeArray[i][j] = 0; |