9682

Класс TList - списки

Лекция

Информатика, кибернетика и программирование

Класс TList - списки Класс TList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. Списки отличаются от массивов двумя важными особенностями...

Русский

2013-03-15

57 KB

4 чел.

Класс TList – списки

Класс TList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. Списки отличаются от массивов двумя важными особенностями. Во-первых, их размер может динамически меняться в ходе работы программы, фактически ограничиваясь лишь доступной памятью. Во-вторых, в списках могут храниться элементы разных типов.

Технически списки представляют собой массивы нетипизированных указателей на размещенные в динамической памяти элементы. Эти массивы размещаются в куче - отсюда возможность динамического изменения размеров списков; с другой стороны, входящие в списки нетипизированные указатели позволяют ссылаться на произвольные элементы.

Свойства класса:

property Capacity: Integer;

Содержит количество элементов массива указателей коллекции; всегда больше Count. Если при добавлении очередного элемента Count стало равно Capacity, происходит автоматическое расширение списка на 16 элементов.

property Count: Integer;

Количество элементов списка. Это свойство изменяется при добавлении или удалении элемента.

property Items (Index: Integer): Pointer;

Возвращает указатель на элемент списка по его индексу. Самый первый элемент списка имеет индекс 0.

property List: pPointerList;

Возвращает указатель на массив элементов списка.

Тип pPointerList определен следующим образом:

type

pPointerList = ^TPointerList;

TPointerList = array [0..MaxListSize] of Pointer;

Константа MaxListSize для Delphi 1.0 ограничена значением 16379 элементов. Для старших версий Delphi она ограничивается доступной памятью.

Следует учесть, что свойство Count определяет количество помещенных в список элементов, в то время как Capacity - текущую емкость списка. Если при добавлении очередного элемента обнаруживается, что емкость списка исчерпана, происходит наращивание емкости на фиксированную величину (для Count меньше 5 - на 4 элемента, для Count в диапазоне 5...7 - на 8, для Count больше 7 - на 16). При этом сначала резервируется память для размещения расширенного массива указателей, затем в нее копируется содержимое старого массива, после чего старый массив указателей уничтожается (занимаемая им память возвращается Windows). Если вы заранее знаете, сколько элементов необходимо поместить в список, установите в начале работы нужное значение в свойство Capacity - это снизит непроизводительные затраты времени на расширение списка.

Методы класса:

function Add (Item: Pointer) : Integer;

Добавляет элемент Item в конец списка и возвращает его индекс.

procedure Clear;

Очищает список, удаляя из него все элементы. Не освобождает память, связанную с каждым удаленным элементом. Устанавливает в свойства Count и Capacity значение 0.

procedure Delete (Index: Integer) ;

Удаляет из списка элемент с индексом Index. Все элементы, расположенные за удаляемым, смещаются на одну позицию вверх.

procedure Exchange (Index1, Index2 : Integer);

Меняет местами элементы с индексами Index1 и Index2.

function Expand: TList;

Расширяет массив элементов, увеличивая Capacity.

function First: Pointer;

Возвращает указатель на самый первый элемент списка.

function IndexOf (Item: Pointer) : Integer;

Отыскивает в списке элемент Item и возвращает его индекс.

procedure Insert (Index: Integer; Item: Pointer) ;

Вставляет элемент Item в позицию Index списка: новый элемент получает индекс Index, все элементы с индексами Index и больше увеличивают свой индекс на 1. При необходимости расширяет список.

function Last: Pointer;

Возвращает указатель на последний элемент списка.

procedure Move (CurIndex, NewIndex: Integer) ;

Перемещает элемент в списке с позиции CurIndex в позицию NewIndex. Все элементы старого списка с индексами от CurIndex-1 до NewIndex уменьшают свой индекс на 1.

procedure Pack;

Упаковывает список: удаляет пустые элементы в конце массива индексов.

function Remove (Item: Pointer) : Integer;

Отыскивает в списке элемент Item и удаляет его.

procedure Sort (Compare: TListSortCompare) ;

Сортирует коллекцию с помощью функции Compare.

Методы Add и Insert получают указатель на вставляемый элемент. Чтобы воспользоваться ими, программист должен сам разместить в куче данные и получить соответствующий указатель. Точно так же методы Delete, Remove и Clear не уничтожают распределенные в памяти данные, которые программист должен, если это необходимо, уничтожить сам. Например:

var

 List: TList;

 Item: Pointer;

 Value: AnyType;

begin

 List := TList.Create; // Создаем список

 Item := New(Value);  // Размещаем в куче данные

 List.Add(Item);  // Добавляем элемент к списку

 List.Remove(Item);  // Удаляем элемент из списка

 . . . . . . . .

 Dispose(Item);   // Удаляем его из кучи

 List.Free;    // Удаляем ненужный список

end;

Метод Sort сортирует список по критерию, устанавливаемому функцией Compare. Тип TListSortCompare определен следующим образом:

TListSortCompare = function(Item1,Item2:Pointer):Integer;

Таким образом, функция Compare получает указатели на два элемента списка. Результат сравнения:

  •  любое отрицательное число, если Item1^ < Item2^;
  •  0, если Item1^ = Item2^;
  •  любое положительное число, если Item1^ > Item2^.

Критерий сравнения данных устанавливается программистом и реализуется в функции Compare.

В следующем примере в список List помещается 20 случайных вещественных чисел, равномерно распределенных в диапазоне 0...1. Список сортируется по возрастанию чисел и отображается в компоненте mmOutput (многострочный редактор из лабораторной работы № 4).

type

 PDouble = ^Double; {Этот тип используется для приведения нетипизи-
       рованных указателей к указателям на вещественный тип Double}

 function Comp(Item1, Item2: Pointer): Integer;

 // С помощью этой функции реализуется сортировка чисел

 begin

   if PDouble(Item1)^ < PDouble(Item2)^ then

     Result := -1

   else if PDouble(Item1)^ > PDouble(Item2)^ then

     Result := 1

   else

     Result := 0

 end;

 procedure TfmExample.bbRunClick(Sender: TObject);

 // Обработчик нажатий кнопки bbOk выполняет основную работу

 var

   k: Integer;

   List: TList;

   pD: PDouble;

 begin

   List := TList.Create; // Создаем список

   for k := 1 to 20 do  // Наполняем его

   begin

     New(pD);    // Резервируем память

     рD^ := Random;  // Помещаем в нее случайное число

     List.Add(pD);   // Добавляем к списку

   end;

   List.Sort(Comp);  // Сортируем список по возрастанию

   mmOutput.Lines.Clear; // Очищаем редактор mmOutput

   {В следующем цикле наполняем mmOutput и уничтожаем элементы List}

   for k := 0 to List.Count-1 do

   begin

     pD := List[k]; // Очередное число из списка

     mmOutput.Lines.Add(FloatToStr(pD^)); // Помещаем в mmOutput

     Dispose(pD)      // Уничтожаем число

   end;

   List.Free;       // Уничтожаем список

 end;


 

А также другие работы, которые могут Вас заинтересовать

30664. Своеобразие сатиры В.В. Маяковского в стихотворениях «О дряни», «Прозаседавшиеся» 13.67 KB
  Маяковского в стихотворениях О дряни Прозаседавшиеся В дореволюционный период творчества поэта основной целью его сатиры было беспощадно обличение существующего строя.Первая группа сатирических произведений поэта разоблачает и высмеивает мещанство О дряни Еще раз о дряни Ханжа Маруся отравилась и др.В сатирическом фельетоне а именно так исследователи определили жанр этого произведения О дряни Маяковский обличает мещанство.
30665. Своеобразие стиля Чехова-прозаика (на примере рассказов «Человек в футляре», «Крыжовник», «О любви») 14.02 KB
  Чехов стремится в своих рассказах проследить динамику человеческой души в разных ее проявлениях и во всей ее глубине. Но ведь обыденность и творит личность и Чехов стремится обратить внимание читателя на отдельные дни и часы маленького обывательского существования осмыслить их и помочь человеку жить осознанно. А в рассказе О любви устами главного героя Чехов скажет: Я понял что когда любишь то в своих рассуждениях об этой любви нужно исходить от высшего от более важного чем счастье или несчастье грех или добродетель или не...
30666. В чем смысл финала рассказа А.П.Чехова «Ионыч» 13.61 KB
  Чехов обращается к проблеме духовной деградации человека. К 3536 годам он уже превращается в Ионыча ожирел потерял совесть и стал похож не на человека а на языческого божка. В конце рассказа мы уже не видим прежнего молодого человека который мог бы прийти ночью на свидание на кладбище. Он променял живые мысли на сытое самодовольное существование он не смог сберечь в себе человека.
30667. СПОСОБЫ ВЫРАЖЕНИЯ АВТОРСКОЙ ПОЗИЦИИ 20.95 KB
  Заглавие вводит читателя в мир произведения выражает основную тему текста определяет его важнейшую сюжетную линию или указывает на его главный конфликт. Б Заглавие может называть главного героя произведения Евгений Онегин Обломов Анна Каренина Иванов В Заглавие текста может указывать на время и место действия Полтава А. Таким образом заглавие художественного произведения вопервых соотносит сам текст с его художественным миром: главными героями временем действия: Гусев А. Чехова Ионыч...
30668. Стихотворение Б.Л. Пастернака «Никого не будет в доме...». (Восприятие, истолкование, оценка) 12.34 KB
  В стихотворении Никого не будет в доме мы видим причудливое взаимодействие высокого и привычного обычной человеческой жизни и тайн природы. В стихотворении мы видим описание пограничного явления сумерек. Сквозной проем сквозь который мы видим ускользающий зимний день крыши и снег выглядит как проем в другой мир в который мы подсматриваем. Мы не видим кто идет но понимаем что это человек очень дорогой лирическому герою.
30669. Стихотворение Н.А. Некрасова «Элегия» («Пускай нам говорит изменчивая мода…»). Восприятие, истолкование, оценка. Особенности жанра 13.08 KB
  Творчество этого поэта не только внесло большие изменения в литературный процесс но и оказало большое влияние на общественную атмосферу эпохи. Этот поэт сделал предметом своего изображения те вещи которые до него считались непоэтическими: уличное воровство проституцию пьянство самоубийства семейные раздоры и так далее.Роль поэта и предназначения поэзии отдельная тема в творчестве Некрасова. Свое поэтическое кредо поэт изложил в стихотворении Элегия 1874.
30670. Судьба человека в контексте эпохи (по рассказам И.А. Бунина «Господин из Сан-Франциско» и «Чистый понедельник») 13.94 KB
  В этом отношении показательны рассказы Чистый понедельник и Господин из Сан-Франциско. Рассказ Господин из Сан-Франциско раскрывает кризис западноевропейской цивилизации постигший ее в начале 20 века.Герой рассказа некий господин из Сан-Франциско становится символом бездуховного буржуазного мира.
30671. Сюжет, композиция и проблематика рассказа М. Горького «Старуха Изергиль» 14.18 KB
  Повествование много повидавшей на своем веку Изергиль делится на три самостоятельные части: легенда о Ларре рассказ Изергиль о своей жизни легенда о Данко.Легенды о Ларре и Данко раскрывают две концепции жизни два представления о ней.Себялюбцу Ларре контрастно противопоставлен герой второй легенды Данко. Ларра ценил только себя и свою свободу Данко же решил добыть ее для всего племени.
30672. Мотив дуэли в произведениях отечественной классики XIX в 13.4 KB
  Дуэль как социальное явление целой эпохи является одной из проблем поднимаемой в классической литературе.Писатели 19 века воспринимали дуэль как единственный и во многом естественный способ отстоять свою честь свое дворянское и офицерское достоинство.В романе Евгений Онегин дуэль становится тем явлением которое противоречит внутреннему миру героя.Перед дуэлью Онегин спокойно проспал всю ночь в противоположность Ленскому.