std/critbits
SourceEditЭтот модуль реализует дерево критических битов, которое является эффективным контейнером для отсортированного набора строк или для отсортированной карты строк. Основано на отличной статье Адама Ленгли. (Дерево критических битов является разновидностью дерева префиксных кодов или дерева Патриции.)
Пример:
import std/critbits
from std/sequtils import toSeq
var critbitAsSet: CritBitTree[void] = ["kitten", "puppy"].toCritBitTree
doAssert critbitAsSet.len == 2
critbitAsSet.incl("")
doAssert "" in critbitAsSet
critbitAsSet.excl("")
doAssert "" notin critbitAsSet
doAssert toSeq(critbitAsSet.items) == @["kitten", "puppy"]
let same = ["puppy", "kitten", "puppy"].toCritBitTree
doAssert toSeq(same.keys) == toSeq(critbitAsSet.keys)
var critbitAsDict: CritBitTree[int] = {"key1": 42}.toCritBitTree
doAssert critbitAsDict.len == 1
critbitAsDict["key2"] = 0
doAssert "key2" in critbitAsDict
doAssert critbitAsDict["key2"] == 0
critbitAsDict.excl("key1")
doAssert "key1" notin critbitAsDict
doAssert toSeq(critbitAsDict.pairs) == @[("key2", 0)] Импорты
- since
Типы
Процедуры
func `$`[T](c: CritBitTree[T]): string
- Преобразует
cв строковое представление.Пример:
doAssert $CritBitTree[int].default == "{:}" doAssert $toCritBitTree({"key1": 1, "key2": 2}) == """{"key1": 1, "key2": 2}""" doAssert $CritBitTree[void].default == "{}" doAssert $toCritBitTree(["key1", "key2"]) == """{"key1", "key2"}"""Исходный код Редактировать func `[]`[T](c: CritBitTree[T]; key: string): lent T {.inline.}-
Извлекает значение по
c[key]. Еслиkeyне содержится вt, возбуждается исключениеKeyError. Можно проверить, существует ли ключ с помощьюhasKey.См. также:
Исходный код Редактировать func `[]`[T](c: var CritBitTree[T]; key: string): var T {.inline.}-
Извлекает значение по
c[key]. Значение может быть изменено. Еслиkeyне содержится вt, возбуждается исключениеKeyError.См. также:
Исходный код Редактировать proc `[]=`[T](c: var CritBitTree[T]; key: string; val: sink T)
-
Псевдоним для incl.
См. также:
Исходный код Редактировать func commonPrefixLen[T](c: CritBitTree[T]): int {.inline.}- Возвращает длину самого длинного общего префикса всех ключей в
c. Еслиcпусто, возвращает 0.Пример:
var c: CritBitTree[void] doAssert c.commonPrefixLen == 0 incl(c, "key1") doAssert c.commonPrefixLen == 4 incl(c, "key2") doAssert c.commonPrefixLen == 3
Исходный код Редактировать func contains[T](c: CritBitTree[T]; key: string): bool {.inline.}- Возвращает true, если
cсодержит данныйkey.Пример:
var c: CritBitTree[void] incl(c, "key") doAssert c.contains("key")Исходный код Редактировать proc containsOrIncl(c: var CritBitTree[void]; key: string): bool {....raises: [], tags: [], forbids: [].}-
Возвращает true, если
cсодержит данныйkey. Если ключ не существует, он добавляется вc.См. также:
Пример:
block: var c: CritBitTree[void] doAssert not c.containsOrIncl("key") doAssert c.contains("key") block: var c: CritBitTree[void] incl(c, "key") doAssert c.containsOrIncl("key")Исходный код Редактировать proc containsOrIncl[T](c: var CritBitTree[T]; key: string; val: sink T): bool
-
Возвращает true, если
cсодержит данныйkey. Если ключ не существует, выполняетсяc[key] = val.См. также:
Пример:
block: var c: CritBitTree[int] doAssert not c.containsOrIncl("key", 42) doAssert c.contains("key") block: var c: CritBitTree[int] incl(c, "key", 21) doAssert c.containsOrIncl("key", 42) doAssert c["key"] == 21Исходный код Редактировать proc excl[T](c: var CritBitTree[T]; key: string)
-
Удаляет
key(и его связанное значение) из множестваc. Еслиkeyне существует, ничего не происходит.См. также:
Пример:
var c: CritBitTree[void] incl(c, "key") excl(c, "key") doAssert not c.contains("key")Исходный код Редактировать func hasKey[T](c: CritBitTree[T]; key: string): bool {.inline.}- Псевдоним для contains. Исходный код Редактировать
proc inc(c: var CritBitTree[int]; key: string; val: int = 1) {....raises: [], tags: [], forbids: [].}- Увеличивает
c[key]наval.Пример:
var c: CritBitTree[int] c["key"] = 1 inc(c, "key") doAssert c["key"] == 2
Исходный код Редактировать proc incl(c: var CritBitTree[void]; key: string) {....raises: [], tags: [], forbids: [].}-
Включает
keyвc.См. также:
Пример:
var c: CritBitTree[void] incl(c, "key") doAssert c.hasKey("key")Исходный код Редактировать proc incl[T](c: var CritBitTree[T]; key: string; val: sink T)
-
Вставляет
keyсо значениемvalвc.См. также:
Пример:
var c: CritBitTree[int] incl(c, "key", 42) doAssert c["key"] == 42
Исходный код Редактировать func len[T](c: CritBitTree[T]): int {.inline.}- Возвращает количество элементов в
cза O(1).Пример:
let c = ["key1", "key2"].toCritBitTree doAssert c.len == 2
Исходный код Редактировать proc missingOrExcl[T](c: var CritBitTree[T]; key: string): bool
-
Возвращает true, если
cне содержит данныйkey. Если ключ существует, выполняетсяc.excl(key).См. также:
Пример:
block: var c: CritBitTree[void] doAssert c.missingOrExcl("key") block: var c: CritBitTree[void] incl(c, "key") doAssert not c.missingOrExcl("key") doAssert not c.contains("key")Исходный код Редактировать proc toCritBitTree(items: sink openArray[string]): CritBitTree[void] {. ...raises: [], tags: [], forbids: [].}- Создаёт новое
CritBitTree, содержащее указанныеitems.Пример:
doAssert ["a", "b", "c"].toCritBitTree is CritBitTree[void]
Исходный код Редактировать proc toCritBitTree[T](pairs: sink openArray[(string, T)]): CritBitTree[T]
- Создаёт новое
CritBitTree, содержащее указанныеpairs.Пример:
doAssert {"a": "0", "b": "1", "c": "2"}.toCritBitTree is CritBitTree[string] doAssert {"a": 0, "b": 1, "c": 2}.toCritBitTree is CritBitTree[int]Исходный код Редактировать
Итераторы
iterator items[T](c: CritBitTree[T]): string
- Псевдоним для keys. Исходный код Изменить
iterator itemsWithPrefix[T](c: CritBitTree[T]; prefix: string): string
- Псевдоним для keysWithPrefix. Исходный код Изменить
iterator keys[T](c: CritBitTree[T]): string
- Возвращает все ключи в лексикографическом порядке.
Пример:
from std/sequtils import toSeq let c = {"key1": 1, "key2": 2}.toCritBitTree doAssert toSeq(c.keys) == @["key1", "key2"]Исходный код Изменить iterator keysWithPrefix[T](c: CritBitTree[T]; prefix: string): string
- Возвращает все ключи, начинающиеся с
prefix.Пример:
from std/sequtils import toSeq let c = {"key1": 42, "key2": 43}.toCritBitTree doAssert toSeq(c.keysWithPrefix("key")) == @["key1", "key2"]Исходный код Изменить iterator mpairs[T](c: var CritBitTree[T]): tuple[key: string, val: var T]
-
Возвращает все (ключ, значение)-пары
cв лексикографическом порядке соответствующих ключей. Возвращаемые значения могут быть изменены.См. также:
Исходный код Изменить iterator mpairsWithPrefix[T](c: var CritBitTree[T]; prefix: string): tuple[ key: string, val: var T]-
Возвращает все (ключ, значение)-пары
c, начинающиеся сprefix. Возвращаемые значения могут быть изменены.См. также:
Исходный код Изменить iterator mvalues[T](c: var CritBitTree[T]): var T
-
Возвращает все значения
cв лексикографическом порядке соответствующих ключей. Значения могут быть изменены.См. также:
Исходный код Изменить iterator mvaluesWithPrefix[T](c: var CritBitTree[T]; prefix: string): var T
-
Возвращает все значения
c, начинающиеся сprefixсоответствующих ключей. Значения могут быть изменены.См. также:
Исходный код Изменить iterator pairs[T](c: CritBitTree[T]): tuple[key: string, val: T]
-
Возвращает все (ключ, значение)-пары
cв лексикографическом порядке соответствующих ключей.См. также:
Пример:
from std/sequtils import toSeq let c = {"key1": 1, "key2": 2}.toCritBitTree doAssert toSeq(c.pairs) == @[(key: "key1", val: 1), (key: "key2", val: 2)]Исходный код Изменить iterator pairsWithPrefix[T](c: CritBitTree[T]; prefix: string): tuple[ key: string, val: T]-
Возвращает все (ключ, значение)-пары
c, начинающиеся сprefix.См. также:
Пример:
from std/sequtils import toSeq let c = {"key1": 42, "key2": 43}.toCritBitTree doAssert toSeq(c.pairsWithPrefix("key")) == @[(key: "key1", val: 42), (key: "key2", val: 43)]Исходный код Изменить iterator values[T](c: CritBitTree[T]): lent T
-
Возвращает все значения
cв лексикографическом порядке соответствующих ключей.См. также:
Пример:
from std/sequtils import toSeq let c = {"key1": 1, "key2": 2}.toCritBitTree doAssert toSeq(c.values) == @[1, 2]Исходный код Изменить iterator valuesWithPrefix[T](c: CritBitTree[T]; prefix: string): lent T
-
Возвращает все значения
c, начинающиеся сprefixсоответствующих ключей.См. также:
Пример:
from std/sequtils import toSeq let c = {"key1": 42, "key2": 43}.toCritBitTree doAssert toSeq(c.valuesWithPrefix("key")) == @[42, 43]Исходный код Изменить
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/critbits.html