std/sets
Исходный кодРедактироватьМодуль sets реализует эффективный хеш-множество и упорядоченное хеш-множество.
Хеш-множества отличаются от встроенного типа множества. Множества позволяют хранить любые значения, которые могут быть хешированы, и они не содержат дубликатов.
Общие случаи использования множеств:
- удаление дубликатов из контейнера путём преобразования с помощью процедуры toHashSet (также см. функцию sequtils.deduplicate)
- проверка принадлежности
- математические операции над двумя множествами, такие как объединение, пересечение, разность и симметрическая разность
Примеры:
echo toHashSet([9, 5, 1]) # {9, 1, 5}
echo toOrderedSet([9, 5, 1]) # {9, 5, 1}
let
s1 = toHashSet([9, 5, 1])
s2 = toHashSet([3, 5, 7])
echo s1 + s2 # {9, 1, 3, 5, 7}
echo s1 - s2 # {1, 9}
echo s1 * s2 # {5}
echo s1 -+- s2 # {9, 1, 3, 7} Примечание: Типы данных, объявленные здесь, имеют смысл значений: Это означает, что = выполняет копирование множества.
См. также:
- модуль intsets для эффективных множеств целых чисел
- модуль tables для хеш-таблиц
Импорты
- hashes, math, outparams
Типы
HashSet[A] {..} = object-
Общее хеш-множество.
Используйте процедуру init или initHashSet перед вызовом других процедур над ним.
Исходный код Редактировать OrderedSet[A] {..} = object-
Общее хеш-множество, которое запоминает порядок вставки.
Используйте процедуру init или initOrderedSet перед вызовом других процедур над ним.
Исходный код Редактировать SomeSet[A] = HashSet[A] | OrderedSet[A]
- Объединение типов, представляющее
HashSetилиOrderedSet. Исходный код Редактировать
Константы
defaultInitialSize = 64
- Исходный код Редактировать
Процедуры
proc `$`[A](s: HashSet[A]): string
-
Преобразует множество
sв строку, в основном для целей протоколирования и вывода.Не используйте эту процедуру для сериализации, представление может измениться в любой момент, и значения не экранируются.
Примеры:
echo toHashSet([2, 4, 5]) # --> {2, 4, 5} echo toHashSet(["no", "esc'aping", "is \" provided"]) # --> {no, esc'aping, is " provided}Исходный код Изменить proc `$`[A](s: OrderedSet[A]): string
-
Преобразует упорядоченное хеш-множество
sв строку, в основном для целей протоколирования и вывода.Не используйте эту процедуру для сериализации, представление может измениться в любой момент, и значения не экранируются.
Примеры:
echo toOrderedSet([2, 4, 5]) # --> {2, 4, 5} echo toOrderedSet(["no", "esc'aping", "is \" provided"]) # --> {no, esc'aping, is " provided}Исходный код Изменить proc `*`[A](s1, s2: HashSet[A]): HashSet[A] {.inline.}- Псевдоним для intersection(s1, s2). Исходный код Изменить
proc `+`[A](s1, s2: HashSet[A]): HashSet[A] {.inline.}- Псевдоним для union(s1, s2). Исходный код Изменить
proc `-`[A](s1, s2: HashSet[A]): HashSet[A] {.inline.}- Псевдоним для difference(s1, s2). Исходный код Изменить
proc `-+-`[A](s1, s2: HashSet[A]): HashSet[A] {.inline.}- Псевдоним для symmetricDifference(s1, s2). Исходный код Изменить
proc `<`[A](s, t: HashSet[A]): bool
-
Возвращает true, если
sявляется строгим или надлежащим подмножествомt.Строгое или надлежащее подмножество
sсодержит все свои члены вt, ноtимеет больше элементов, чемs.Пример:
let a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) c = intersection(a, b) assert c < a and c < b assert(not (a < a))
Исходный код Изменить proc `<=`[A](s, t: HashSet[A]): bool
-
Возвращает true, если
sявляется подмножествомt.Подмножество
sсодержит все свои члены вt, иtнеобязательно имеет больше элементов, чемs. То есть,sможет быть равноt.Пример:
let a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) c = intersection(a, b) assert c <= a and c <= b assert a <= a
Исходный код Изменить proc `==`[A](s, t: HashSet[A]): bool
- Возвращает true, если у
sиtодинаковые члены и размер множества.Пример:
var a = toHashSet([1, 2]) b = toHashSet([2, 1]) assert a == b
Исходный код Изменить proc `==`[A](s, t: OrderedSet[A]): bool
- Равенство для упорядоченных множеств.
Пример:
let a = toOrderedSet([1, 2]) b = toOrderedSet([2, 1]) assert(not (a == b))
Исходный код Изменить proc `[]`[A](s: var HashSet[A]; key: A): var A
-
Возвращает элемент, фактически хранящийся в
s, значение которого совпадает со значениемkey, или генерирует исключениеKeyError.Это полезно, когда перегружены
Исходный код Изменитьhashи==, но всё же требуется семантика ссылок для совместного использования. proc card[A](s: HashSet[A]): int
-
Псевдоним для len().
Card обозначает мощность множества.
Исходный код Изменить proc card[A](s: OrderedSet[A]): int {.inline.}-
Псевдоним для len().
Card обозначает мощность множества.
Исходный код Изменить proc clear[A](s: var HashSet[A])
-
Очищает HashSet до пустого состояния, не уменьшая хранилище.
O(n)операция, гдеn- размер хеш-корзины.См. также:
Пример:
var s = toHashSet([3, 5, 7]) clear(s) assert len(s) == 0
Исходный код Изменить proc clear[A](s: var OrderedSet[A])
-
Очищает OrderedSet до пустого состояния, не уменьшая хранилище.
O(n)операция, гдеn- размер хеш-корзины.Пример:
var s = toOrderedSet([3, 5, 7]) clear(s) assert len(s) == 0
Исходный код Изменить proc contains[A](s: HashSet[A]; key: A): bool
-
Возвращает true, если
keyсодержится вs.Это позволяет использовать оператор
in.См. также:
Пример:
var values = initHashSet[int]() assert(not values.contains(2)) assert 2 notin values values.incl(2) assert values.contains(2) assert 2 in values
Исходный код Изменить proc contains[A](s: OrderedSet[A]; key: A): bool
-
Возвращает true, если
keyсодержится вs.Это позволяет использовать оператор
in.См. также:
Пример:
var values = initOrderedSet[int]() assert(not values.contains(2)) assert 2 notin values values.incl(2) assert values.contains(2) assert 2 in values
Исходный код Изменить
proc containsOrIncl[A](s: var HashSet[A]; key: A): bool
-
Включает
keyв множествоsи сообщает, было лиkeyуже вs.Различие по отношению к процедуре incl заключается в том, что эта процедура возвращает
trueеслиsуже содержалоkey. Процедура вернётfalseеслиkeyбыло добавлено в качестве нового значения вsво время этого вызова.См. также:
- процедуру incl для включения элемента
- процедуру incl для включения другого множества
- процедуру missingOrExcl
Пример:
var values = initHashSet[int]() assert values.containsOrIncl(2) == false assert values.containsOrIncl(2) == true assert values.containsOrIncl(3) == false
Исходный код Редактировать proc containsOrIncl[A](s: var OrderedSet[A]; key: A): bool
-
Включает
keyв множествоsи сообщает, было лиkeyуже вs.Различие по отношению к процедуре incl заключается в том, что эта процедура возвращает
trueеслиsуже содержалоkey. Процедура вернёт false, еслиkeyбыло добавлено в качестве нового значения вsво время этого вызова.См. также:
- процедуру incl для включения элемента
- процедуру missingOrExcl
Пример:
var values = initOrderedSet[int]() assert values.containsOrIncl(2) == false assert values.containsOrIncl(2) == true assert values.containsOrIncl(3) == false
Исходный код Редактировать proc difference[A](s1, s2: HashSet[A]): HashSet[A]
-
Возвращает разность множеств
s1иs2.То же, что и s1 - s2.
Разность двух множеств математически представлена как A ∖ B и представляет собой множество всех объектов, которые являются членами
s1и не являются членамиs2.См. также:
Пример:
let a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) c = difference(a, b) assert c == toHashSet(["a"])
Исходный код Редактировать proc disjoint[A](s1, s2: HashSet[A]): bool
- Возвращает
true, если множестваs1иs2не имеют общих элементов.Пример:
let a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) assert disjoint(a, b) == false assert disjoint(a, b - a) == true
Исходный код Редактировать proc excl[A](s: var HashSet[A]; key: A)
-
Исключает
keyиз множестваs.Ничего не делает, если
keyне найдено вs.См. также:
- процедуру incl для включения элемента
- процедуру excl для исключения другого множества
- процедуру missingOrExcl
Пример:
var s = toHashSet([2, 3, 6, 7]) s.excl(2) s.excl(2) assert s.len == 3
Исходный код Редактировать proc excl[A](s: var HashSet[A]; other: HashSet[A])
-
Исключает все элементы множества
otherизs.Это ин-плейс версия s - other.
См. также:
- процедуру incl для включения другого множества
- процедуру excl для исключения элемента
- процедуру missingOrExcl
Пример:
var numbers = toHashSet([1, 2, 3, 4, 5]) even = toHashSet([2, 4, 6, 8]) numbers.excl(even) assert len(numbers) == 3 ## numbers == {1, 3, 5}Исходный код Редактировать proc excl[A](s: var OrderedSet[A]; key: A)
-
Исключает
keyиз множестваs. Эффективность:O(n).Ничего не делает, если
keyне найдено вs.См. также:
- процедуру incl для включения элемента
- процедуру missingOrExcl
Пример:
var s = toOrderedSet([2, 3, 6, 7]) s.excl(2) s.excl(2) assert s.len == 3
Исходный код Редактировать proc hash[A](s: HashSet[A]): Hash
- Хеширование HashSet. Исходный код Редактировать
proc hash[A](s: OrderedSet[A]): Hash
- Хеширование OrderedSet. Исходный код Редактировать
proc incl[A](s: var HashSet[A]; key: A)
-
Включает элемент
keyвs.Ничего не делает, если
keyуже содержится вs.См. также:
- процедуру excl для исключения элемента
- процедуру incl для включения другого множества
- процедуру containsOrIncl
Пример:
var values = initHashSet[int]() values.incl(2) values.incl(2) assert values.len == 1
Исходный код Редактировать proc incl[A](s: var HashSet[A]; other: HashSet[A])
-
Включает все элементы множества
otherвs(должно быть объявлено какvar).Это ин-плейс версия s + other.
См. также:
- процедуру excl для исключения другого множества
- процедуру incl для включения элемента
- процедуру containsOrIncl
Пример:
var values = toHashSet([1, 2, 3]) others = toHashSet([3, 4, 5]) values.incl(others) assert values.len == 5
Исходный код Редактировать proc incl[A](s: var HashSet[A]; other: OrderedSet[A])
-
Включает все элементы из OrderedSet
otherв HashSets(должно быть объявлено какvar).См. также:
- процедуру incl для включения элемента
- процедуру containsOrIncl
Пример:
var values = toHashSet([1, 2, 3]) others = toOrderedSet([3, 4, 5]) values.incl(others) assert values.len == 5
Исходный код Редактировать proc incl[A](s: var OrderedSet[A]; key: A)
-
Включает элемент
keyвs.Ничего не делает, если
keyуже содержится вs.См. также:
- процедуру excl для исключения элемента
- процедуру incl для включения другого множества
- процедуру containsOrIncl
Пример:
var values = initOrderedSet[int]() values.incl(2) values.incl(2) assert values.len == 1
Исходный код Редактировать
proc init[A](s: var HashSet[A]; initialSize = defaultInitialSize)
-
Инициализирует множество хешей.
Начиная с Nim v0.20, множества инициализируются по умолчанию, и вызывать эту функцию явно не обязательно.
Вы можете вызвать эту процедуру для уже инициализированного множества хешей, которое отбросит все свои значения. Это может быть удобнее, чем итерироваться по существующим значениям и вызывать excl() для них.
См. также:
Пример:
var a: HashSet[int] init(a)
Исходный код Редактировать proc init[A](s: var OrderedSet[A]; initialSize = defaultInitialSize)
-
Инициализирует упорядоченное множество хешей.
Начиная с Nim v0.20, множества инициализируются по умолчанию, и вызывать эту функцию явно не обязательно.
Вы можете вызвать эту процедуру для уже инициализированного множества хешей, которое отбросит все свои значения. Это может быть удобнее, чем итерироваться по существующим значениям и вызывать excl() для них.
См. также:
Пример:
var a: OrderedSet[int] init(a)
Исходный код Редактировать proc initHashSet[A](initialSize = defaultInitialSize): HashSet[A]
-
Обёртка вокруг процедуры init для инициализации множеств хешей.
Возвращает пустое множество хешей, которое вы можете присвоить напрямую в
varблоках в одну строку.Начиная с Nim v0.20, множества инициализируются по умолчанию, и вызывать эту функцию явно не обязательно.
См. также:
Пример:
var a = initHashSet[int]() a.incl(3) assert len(a) == 1
Исходный код Редактировать proc initOrderedSet[A](initialSize = defaultInitialSize): OrderedSet[A]
-
Обёртка вокруг процедуры init для инициализации упорядоченных множеств хешей.
Возвращает пустое упорядоченное множество хешей, которое вы можете присвоить напрямую в
varблоках в одну строку.Начиная с Nim v0.20, множества инициализируются по умолчанию, и вызывать эту функцию явно не обязательно.
См. также:
Пример:
var a = initOrderedSet[int]() a.incl(3) assert len(a) == 1
Исходный код Редактировать proc initSet[A](initialSize = defaultInitialSize): HashSet[A] {. ...deprecated: "Deprecated since v0.20, use \'initHashSet\'".}- Исходный код Редактировать
proc intersection[A](s1, s2: HashSet[A]): HashSet[A]
-
Возвращает пересечение множеств
s1иs2.То же самое, что и s1 * s2.
Пересечение двух множеств математически представлено как A ∩ B и представляет собой множество всех объектов, которые являются членами
s1иs2одновременно.См. также:
Пример:
let a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) c = intersection(a, b) assert c == toHashSet(["b"])
Исходный код Редактировать proc isValid[A](s: HashSet[A]): bool {....deprecated: "Deprecated since v0.20; sets are initialized by default".}- Возвращает
true, если множество было инициализировано (с процедурой initHashSet или процедурой init).Пример:
proc savePreferences(options: HashSet[string]) = assert options.isValid, "Pass an initialized set!" # Do stuff here, may crash in release builds!
Исходный код Редактировать proc len[A](s: HashSet[A]): int
-
Возвращает количество элементов в
s.Из-за особенности реализации вы можете вызвать эту процедуру для переменных, которые еще не были инициализированы. В этом случае процедура вернёт ноль как длину.
Пример:
var a: HashSet[string] assert len(a) == 0 let s = toHashSet([3, 5, 7]) assert len(s) == 3
Исходный код Редактировать proc len[A](s: OrderedSet[A]): int {.inline.}-
Возвращает количество элементов в
s.Из-за особенности реализации вы можете вызвать эту процедуру для переменных, которые еще не были инициализированы. В этом случае процедура вернёт ноль как длину.
Пример:
var a: OrderedSet[string] assert len(a) == 0 let s = toHashSet([3, 5, 7]) assert len(s) == 3
Исходный код Редактировать proc map[A, B](data: HashSet[A]; op: proc (x: A): B {.closure.}): HashSet[B] {. effectsOf: op.}-
Возвращает новое множество после применения
opпроцедуры к каждому элементу множестваdata.Вы можете использовать эту процедуру для преобразования элементов множества.
Пример:
let a = toHashSet([1, 2, 3]) b = a.map(proc (x: int): string = $x) assert b == toHashSet(["1", "2", "3"])
Исходный код Редактировать proc missingOrExcl[A](s: var HashSet[A]; key: A): bool
-
Исключает
keyиз множестваsи указывает, было лиkeyуже отсутствовало вs.Разница по сравнению с процедурой excl заключается в том, что эта процедура возвращает
trueеслиkeyотсутствовало вs. Процедура вернётfalseеслиkeyбыло вsи было удалено во время этого вызова.См. также:
- процедуру excl для исключения элемента
- процедуру excl для исключения другого множества
- процедуру containsOrIncl
Пример:
var s = toHashSet([2, 3, 6, 7]) assert s.missingOrExcl(4) == true assert s.missingOrExcl(6) == false assert s.missingOrExcl(6) == true
Исходный код Редактировать proc missingOrExcl[A](s: var OrderedSet[A]; key: A): bool
-
Исключает
keyиз множестваsи указывает, было лиkeyуже отсутствовало вs. Эффективность: O(n).Разница по сравнению с процедурой excl заключается в том, что эта процедура возвращает
trueеслиkeyотсутствовало вs. Процедура вернётfalseеслиkeyбыло вsи было удалено во время этого вызова.См. также:
Пример:
var s = toOrderedSet([2, 3, 6, 7]) assert s.missingOrExcl(4) == true assert s.missingOrExcl(6) == false assert s.missingOrExcl(6) == true
Исходный код Редактировать proc pop[A](s: var HashSet[A]): A
-
Удаляет и возвращает произвольный элемент из множества
s.Вызывает
KeyErrorесли множествоsпустое.См. также:
Пример:
var s = toHashSet([2, 1]) assert [s.pop, s.pop] in [[1, 2], [2,1]] # order unspecified doAssertRaises(KeyError, echo s.pop)
Исходный код Редактировать
proc symmetricDifference[A](s1, s2: HashSet[A]): HashSet[A]
-
Возвращает симметрическую разность множеств
s1иs2.То же самое, что и s1 -+- s2.
Симметрическая разность двух множеств математически представлена как A △ B или A ⊖ B и является множеством всех объектов, которые являются членами
s1илиs2, но не одновременно.См. также:
Пример:
let a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) c = symmetricDifference(a, b) assert c == toHashSet(["a", "c"])
Исходный код Изменить proc toHashSet[A](keys: openArray[A]): HashSet[A]
-
Создаёт новое хеш-множество, содержащее элементы заданного набора (последовательности, массива или строки)
keys.Дубликаты удаляются.
См. также:
Пример:
let a = toHashSet([5, 3, 2]) b = toHashSet("abracadabra") assert len(a) == 3 ## a == {2, 3, 5} assert len(b) == 5 ## b == {'a', 'b', 'c', 'd', 'r'}Исходный код Изменить proc toOrderedSet[A](keys: openArray[A]): OrderedSet[A]
-
Создаёт новое упорядоченное множество, содержащее члены заданного набора (последовательности, массива или строки)
keys.Дубликаты удаляются.
См. также:
Пример:
let a = toOrderedSet([5, 3, 2]) b = toOrderedSet("abracadabra") assert len(a) == 3 ## a == {5, 3, 2} # different than in HashSet assert len(b) == 5 ## b == {'a', 'b', 'r', 'c', 'd'} # different than in HashSetИсходный код Изменить proc toSet[A](keys: openArray[A]): HashSet[A] {. ...deprecated: "Deprecated since v0.20, use \'toHashSet\'".}- Исходный код Изменить
proc union[A](s1, s2: HashSet[A]): HashSet[A]
-
Возвращает объединение множеств
s1иs2.То же самое, что и s1 + s2.
Объединение двух множеств математически представлено как A ∪ B и является множеством всех объектов, которые являются членами
s1,s2или и того, и другого.См. также:
Пример:
let a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) c = union(a, b) assert c == toHashSet(["a", "b", "c"])
Исходный код Изменить
Итераторы
iterator items[A](s: HashSet[A]): A
-
Итерируется по элементам множества
s.Если вам нужна последовательность с элементами, вы можете использовать шаблон sequtils.toSeq.
type pair = tuple[a, b: int] var a, b = initHashSet[pair]() a.incl((2, 3)) a.incl((3, 2)) a.incl((2, 3)) for x, y in a.items: b.incl((x - 2, y + 1)) assert a.len == 2 echo b # --> {(a: 1, b: 3), (a: 0, b: 4)}Исходный код Изменить iterator items[A](s: OrderedSet[A]): A
-
Итерируется по ключам в упорядоченном множестве
sв порядке вставки.Если вам нужна последовательность с элементами, вы можете использовать шаблон sequtils.toSeq.
var a = initOrderedSet[int]() for value in [9, 2, 1, 5, 1, 8, 4, 2]: a.incl(value) for value in a.items: echo "Got ", value # --> Got 9 # --> Got 2 # --> Got 1 # --> Got 5 # --> Got 8 # --> Got 4
Исходный код Изменить iterator pairs[A](s: OrderedSet[A]): tuple[a: int, b: A]
- Итерируется по кортежам (позиция, значение) упорядоченного множества
s.Пример:
let a = toOrderedSet("abracadabra") var p = newSeq[(int, char)]() for x in pairs(a): p.add(x) assert p == @[(0, 'a'), (1, 'b'), (2, 'r'), (3, 'c'), (4, 'd')]Исходный код Изменить
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/sets.html