Множества
Множество представляет собой набор элементов одного типа. Элементы множества считаются неупорядоченными; каждый элемент может входить во множество не более одного раза. Тип множества описывается следующим образом:
set of
базовый тип
В качестве базового может быть любой тип, в том числе строковый и классовый.
Например:
type ByteSet = set of byte;
StringSet = set of string;
Digits = set of '0'..'9';
SeasonSet = set of (Winter,Spring,Summer,Autumn);
PersonSet = set of Person;
Элементы базового типа сравниваются на равенство следующим образом: у простых типов, строк и указателей сравниваются значения, у структурированных и у классов - значения всех элементов или полей. Однако, если поля относятся к ссылочному типу, то сравниваются только их адреса (неглубокое сравнение).
Переменная типа множество может содержать несколько значений базового типа. Чтобы сконструировать значение типа множество, используется конструкция вида
[
список значений
]
где в списке могут перечисляться через запятую либо
выражения базового типа, либо (для порядковых типов) их диапазоны в виде a..b
,
где a
и b
- выражения базового типа. Например:
var
bs: ByteSet := [1,3,5,20..25];
fios: StringSet := ['Иванов','Петров','Сидорова'];
Значения в списке могут отсутствовать, тогда множество является пустым:
bs:=[];
Пустое множество совместимо по присваиванию с множеством любого типа.
Для множеств имеет место структурная эквивалентность типов.
Множества целых и множества на базе типа и его диапазонного подтипа или на базе двух диапазонных типов одного базового типа неявно преобразуются друг к другу. Если при присваивании s := s1 во множестве s1 содержатся элементы, которые не входят в диапазон значений базового типа для множества s, то они отсекаются.
Например:
var st: set of 3..9;
...
st := [1..5,8,10,12]; // в st попадут значения [3..5,8]
Операция in
проверяет
принадлежность элемента множеству:
if Wed in bestdays then ...
Для множеств определены
операции +
(объединение), -
(разность), *
(пересечение),
= (равенство), <>
(неравенство), <= (нестрогое вложение), < (строгое вложение), >= (нестрого
содержит) и > (строго содержит).
Процедура write
при выводе множества выводит все его элементы.
Например,
write(['Иванов','Петров','Сидорова']);
выведет ['Иванов','Петров','Сидорова']
, при этом
данные, если это возможно, будут отсортированы по возрастанию.
Для перебора всех элементов множества можно использовать цикл
foreach
, данные перебираются в некотором внутреннем
порядке:
foreach var s in fios do
write(s,' ');
Для добавления элемента x
к множеству s
используется конструкция s += [x]
или стандартная процедура
Include
: Include(s,x)
. Для удаления элемента x
из множества s
используется конструкция s -= [x]
или стандартная процедура Exclude
: Exclude(s,x)
.