Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.16. Массив битовых флажков (tBits)

Иногда в программе бывает нужно организовать массив булевых флажков большой (а иногда очень большой) размерности. Выполнить данную задачу поможет специально предназначенный для этого объект TBits (в модуле KOLadd). Флажки в нем хранятся, как единый сплошной массив битов (упакованных по 8 бит в байте). При этом обеспечивается достаточно высокая скорость работы с флажками, и имеется ряд быстрых операций, позволяющих повысить эффективность работы при выполнении некоторых традиционных задач, для которых обычно используются такие массивы.

Конструктор:

NewBits - создает пустой объект для хранения динамического массива флажков, возвращает указатель типа PBits на этот объект.

Методы и свойства:

Bits[ i ] - доступ к отдельным флажкам массива. Чтение за пределами массива всегда возвращает false. Запись за пределами массива обеспечивает автоматическое увеличение массива (если записывается значение true);

Count - количество флажков в массиве (только чтение);

Size - размер массива флажков в байтах (так же только чтение);

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

IndexOf( b ) - возвращает индекс первого флажка с указанным булевым значением;

OpenBit - аналогично предыдущему, но возвращает индекс первого флажка false в массиве;

InstallBits( i, j, b ) - для непрерывной группы флажков начиная с индекса i, и длины j устанавливает значение b;

Clear - очищает массив флажков, освобождая занятую память. Если полагать массив безгранично расширяющимся вправо, то данная операция семантически эквивалентна записи false во все флажки массива;

Copy( i, j ) - создает на основе данного новый объект TBits (возвращая указатель на него типа PBits), копируя в него j флажков начиная с индекса i;

Range( i, j ) - функция, эквивалентная предыдущей;

AssignBits( to_i, from_bits, from_i, j ) - копирует j флажков из другого объекта TBits с позиции from_i;

SaveToStream( strm ) - сохраняет массив флажков в поток с текущей позиции. Сначала записывается число битов в массиве, затем сами биты;

LoadFromStream( strm ) - загружает массив битов из потока. данные должны быть сохранены в потоке ранее методом SaveToStream.

2.17. Дерево в памяти (tTree)

Для того, чтобы возможно было в памяти эффективно хранить и обрабатывать организованные в виде деревьев данные, создан объектный тип TTree (в модуле KOLadd).

Конструктор:

NewTree( Parent ) или NewTree( Parent, Name ) - создает новый узел, подчиненный "родительскому" узлу Parent (может быть nil, для создания узла самого верхнего уровня). Возвращается указатель на созданный объект, типа PTree. Первый вариант конструктора следует использовать в проектах, в которых имеется символ условной компиляции TREE_NONAME. В этом случае узлы дерева не имеют свойства Name и не предназначены для хранения строки в качестве основного элемента узла. Во втором случае в конструкторе (и в соответствующем свойстве Name) используются обычные строки, или могут использоваться Unicode-строки (WideString). Для перехода к использованию строк Unicode в проект необходимо включить символ условной компиляции TREE_WIDE.

Методы и свойства:

Name - имя узла. Как уже отмечено, данное свойство не существует, если в проекте используется символ условной компиляции TREE_NONAME;

Data - данные узла. Вообще говоря, любой указатель или 32-разрядное число;

Count - количество подчиненных узлов следующего уровня (т.е. число узлов, непосредственным родителем которых является данный узел);

Total - общее количество подчиненных узлов всех нижележащих уровней (но сам узел не учитывается, как и для Count);

Items[ i ] - доступ к списку подчиненных узлов (для хранения списка дочерних узлов задействуется в реализации объект TList);

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

Insert( i, Node ) - вставляет указанный узел в список дочерних узлов, в позицию i. Так же, как и метод Add, отсоединяет вставляемый узел от прежнего его родителя;

SwapNodes( i, j ) - обменивает узлы с индексами i и j местами;

SortByName - сортирует узлы по именам (поле Name должно существовать);

Parent - родительский узел;

Index - собственный индекс узла в списке дочерних узлов родительского узла (Parent);

PrevSibling - возвращает указатель предыдущего узла в списке дочерних узлов своего родителя (или nil, если нет такого узла);

NextSibling - возвращает указатель следующего узла в списке дочерних узлов своего родителя (или nil);

Root - возвращает указатель родительского узла самого верхнего уровня (для узла, который не имеет родителя, он сам же и возвращается);

Level - возвращает уровень узла, т.е. число предков узла в иерархии дерева (для корневого узла возвращается 0);

IsParentOfNode( Node ) - проверяет, является ли данный узел предком указанного узла Node в иерархии дерева;

IndexOf( Node ) - возвращает "тотальный" индекс дочернего узла любого уровня вложенности Node. Примечание: тотальный, или общий индекс - это индекс в массиве, который условно строится как последовательность всех дочерних узлов, каждый из которых считается вместе со всеми своими подчиненными узлами. Не следует его путать с индексом узла в списке дочерних элементов одного уровня;