Spec-Zone.ru › Nim 1

таблицы

Модуль tables реализует варианты эффективной хеш-таблицы (также часто называемой словарем в других языках программирования), которая представляет собой отображение ключей на значения.

Доступно несколько разных типов хеш-таблиц:

  • Таблица — обычная хеш-таблица,
  • Отсортированная таблица — подобна Table, но запоминает порядок вставки,
  • Таблица подсчёта — отображение ключа на его количество вхождений

Для согласованности со всеми другими типами данных в Nim у них есть семантика значения, это означает, что = выполняет копирование хеш-таблицы.

Для семантики ссылок используйте их варианты Ref: TableRef, OrderedTableRef и CountTableRef.

Например, когда a является Table, тогда var b = a создаёт новую независимую таблицу b. b инициализируется содержимым a. Изменение b не влияет на a и наоборот:

import tables

var
  a = {1: "one", 2: "two"}.toTable  # creates a Table
  b = a

echo a, b  # output: {1: one, 2: two}{1: one, 2: two}

b[3] = "three"
echo a, b  # output: {1: one, 2: two}{1: one, 2: two, 3: three}
echo a == b  # output: false

С другой стороны, когда a является TableRef, тогда изменения в b также влияют на a. Обе a и b ссылаются на одну и ту же структуру данных:

import tables

var
  a = {1: "one", 2: "two"}.newTable  # creates a TableRef
  b = a

echo a, b  # output: {1: one, 2: two}{1: one, 2: two}

b[3] = "three"
echo a, b  # output: {1: one, 2: two, 3: three}{1: one, 2: two, 3: three}
echo a == b  # output: true

Основное использование

Таблица

import tables
from sequtils import zip

let
  names = ["John", "Paul", "George", "Ringo"]
  years = [1940, 1942, 1943, 1940]

var beatles = initTable[string, int]()

for pairs in zip(names, years):
  let (name, birthYear) = pairs
  beatles[name] = birthYear

echo beatles
# {"George": 1943, "Ringo": 1940, "Paul": 1942, "John": 1940}


var beatlesByYear = initTable[int, seq[string]]()

for pairs in zip(years, names):
  let (birthYear, name) = pairs
  if not beatlesByYear.hasKey(birthYear):
    # if a key doesn't exist, we create one with an empty sequence
    # before we can add elements to it
    beatlesByYear[birthYear] = @[]
  beatlesByYear[birthYear].add(name)

echo beatlesByYear
# {1940: @["John", "Ringo"], 1942: @["Paul"], 1943: @["George"]}

Отсортированная таблица

Отсортированная таблица используется, когда важно сохранить порядок вставки ключей.

import tables

let
  a = [('z', 1), ('y', 2), ('x', 3)]
  t = a.toTable          # regular table
  ot = a.toOrderedTable  # ordered tables

echo t   # {'x': 3, 'y': 2, 'z': 1}
echo ot  # {'z': 1, 'y': 2, 'x': 3}

Таблица подсчёта

Таблица подсчёта полезна для подсчёта количества элементов некоторого контейнера (например, строки, последовательности или массива), поскольку она представляет собой отображение, где элементы являются ключами, а их количество вхождений — значениями. Для этой цели удобна процедура toCountTable:

import tables

let myString = "abracadabra"
let letterFrequencies = toCountTable(myString)
echo letterFrequencies
# output: {'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r': 2}

Того же можно было достичь, вручную перебирая контейнер и увеличивая значение каждого ключа с помощью процедуры inc:

import tables

let myString = "abracadabra"
var letterFrequencies = initCountTable[char]()
for c in myString:
  letterFrequencies.inc(c)
echo letterFrequencies
# output: {'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r': 2}

Хеширование

Если вы используете простые стандартные типы, такие как int или string для ключей таблицы, у вас не будет проблем, но как только вы попытаетесь использовать более сложный объект в качестве ключа, вас ждёт странная ошибка компилятора:

Ошибка: несовпадение типов: получен (Person), ожидался один из: hashes.hash(x: openArray[A]): Hash hashes.hash(x: int): Hash hashes.hash(x: float): Hash …

Здесь дело в том, что типы, используемые для ключей таблицы, должны иметь процедуру hash(), которая преобразует их в значение типа Hash, и компилятор перечисляет все известные ему хеш-функции. Кроме того, должен быть оператор ==, который обеспечивает ту же семантику, что и соответствующая ему процедура hash.

После добавления hash и == для вашего пользовательского типа всё будет работать. Однако в настоящее время hash для объектов не определён, в то время как system.== для объектов существует и выполняет "глубокое" сравнение (сравниваются все поля), что обычно и требуется. Таким образом, в следующем примере достаточно реализовать только hash.

import tables, hashes

type
  Person = object
    firstName, lastName: string

proc hash(x: Person): Hash =
  ## Piggyback on the already available string hash proc.
  ##
  ## Without this proc nothing works!
  result = x.firstName.hash !& x.lastName.hash
  result = !$result

var
  salaries = initTable[Person, int]()
  p1, p2: Person

p1.firstName = "Jon"
p1.lastName = "Ross"
salaries[p1] = 30_000

p2.firstName = "소진"
p2.lastName = "박"
salaries[p2] = 45_000

См. также

  • модуль json для структуры данных, похожей на таблицу, которая допускает разнородные члены
  • модуль sharedtables для поддержки совместного использования хеш-таблиц
  • модуль strtabs для эффективных хеш-таблиц, отображающих строки на строки
  • модуль hashes для вспомогательных функций хеширования

Импорты

since, hashes, math, algorithm

Типы

Table[A; B] = object
  data: KeyValuePairSeq[A, B]
  counter: int

Обобщённая хеш-таблица, состоящая из пары "ключ-значение".

data и counter — внутренние детали реализации, к которым нельзя получить доступ.

Для создания пустой Таблицы используйте процедуру initTable.

Исходный код Изменить
TableRef[A; B] = ref Table[A, B]

Вариант со ссылками для Таблицы.

Для создания новой пустой TableRef используйте процедуру newTable.

Исходный код Изменить
OrderedTable[A; B] = object
  data: OrderedKeyValuePairSeq[A, B]
  counter, first, last: int

Хеш-таблица, которая запоминает порядок вставки.

Для создания пустой OrderedTable используйте процедуру initOrderedTable.

Исходный код Изменить
OrderedTableRef[A; B] = ref OrderedTable[A, B]

Вариант со ссылками для Отсортированной таблицы.

Для создания новой пустой OrderedTableRef используйте процедуру newOrderedTable.

Исходный код Изменить
CountTable[A] = object
  data: seq[tuple[key: A, val: int]]
  counter: int
  isSorted: bool

Хеш-таблица, которая считает количество вхождений каждого ключа.

Для создания пустой CountTable используйте процедуру initCountTable.

Исходный код Изменить
CountTableRef[A] = ref CountTable[A]

Вариант со ссылками для Таблицы подсчёта.

Для создания новой пустой CountTableRef используйте процедуру newCountTable.

Исходный код Изменить

Константы

defaultInitialSize = 32
Исходный код Изменить

Процедуры

proc rightSize(count: Natural): int {...}{.inline,
                                      deprecated: "Deprecated since 1.4.0",
                                      raises: [], tags: [].}
Устаревшее: Устаревшее начиная с 1.4.0

Устаревшее начиная с Nim v1.4.0, больше не требуется, так как выбор правильного размера выполняется внутри.

Возвращает значение initialSize для поддержки элементов count.

Если ожидается добавление большего количества элементов, просто добавьте ожидаемое дополнительное количество в параметр перед вызовом этого метода.

Исходный код Изменить
proc initTable[A, B](initialSize = defaultInitialSize): Table[A, B]

Создаёт новую пустую таблицу хеширования.

Начиная с Nim v0.20, таблицы инициализируются по умолчанию, и нет необходимости явно вызывать эту функцию.

См. также:

  • процедура toTable
  • процедура newTable для создания TableRef

Пример:

let
  a = initTable[int, string]()
  b = initTable[char, seq[int]]()
Исходный код Изменить
proc `[]=`[A, B](t: var Table[A, B]; key: A; val: sink B)

Вставляет пару (key, value) в t.

См. также:

  • процедура [] для получения значения ключа
  • процедура hasKeyOrPut
  • процедура mgetOrPut
  • процедура del для удаления ключа из таблицы

Пример:

var a = initTable[char, int]()
a['x'] = 7
a['y'] = 33
doAssert a == {'x': 7, 'y': 33}.toTable
Исходный код Изменить
proc toTable[A, B](pairs: openArray[(A, B)]): Table[A, B]

Создаёт новую таблицу хеширования, содержащую заданные pairs.

pairs — это контейнер, состоящий из (key, value) кортежей.

См. также:

  • процедура initTable
  • процедура newTable для TableRef версии

Пример:

let a = [('a', 5), ('b', 9)]
let b = toTable(a)
assert b == {'a': 5, 'b': 9}.toTable
Исходный код Изменить
proc `[]`[A, B](t: Table[A, B]; key: A): B

Возвращает значение по ключу t[key].

Если key отсутствует в t, генерируется исключение KeyError. Можно проверить существование ключа с помощью процедуры hasKey.

См. также:

  • процедуру getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ отсутствует
  • процедуру []= для вставки новой пары (ключ, значение) в таблицу
  • процедуру hasKey для проверки наличия ключа в таблице

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert a['a'] == 5
doAssertRaises(KeyError):
  echo a['z']
Исходный код Изменить
proc `[]`[A, B](t: var Table[A, B]; key: A): var B

Возвращает значение по ключу t[key]. Значение может быть изменено.

Если key отсутствует в t, генерируется исключение KeyError.

См. также:

  • процедуру getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ отсутствует
  • процедуру []= для вставки новой пары (ключ, значение) в таблицу
  • процедуру hasKey для проверки наличия ключа в таблице
Исходный код Изменить
proc hasKey[A, B](t: Table[A, B]; key: A): bool

Возвращает true, если key присутствует в таблице t.

См. также:

  • процедуру contains для использования с оператором in
  • процедуру [] для получения значения по ключу
  • процедуру getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert a.hasKey('a') == true
doAssert a.hasKey('z') == false
Исходный код Изменить
proc contains[A, B](t: Table[A, B]; key: A): bool
Псевдоним для процедуры hasKey для использования с оператором in.

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert 'b' in a == true
doAssert a.contains('z') == false
Исходный код Изменить
proc hasKeyOrPut[A, B](t: var Table[A, B]; key: A; val: B): bool

Возвращает true, если key есть в таблице, иначе вставляет value.

См. также:

  • процедуру hasKey
  • процедуру [] для получения значения по ключу
  • процедуру getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

var a = {'a': 5, 'b': 9}.toTable
if a.hasKeyOrPut('a', 50):
  a['a'] = 99
if a.hasKeyOrPut('z', 50):
  a['z'] = 99
doAssert a == {'a': 99, 'b': 9, 'z': 50}.toTable
Исходный код Изменить
proc getOrDefault[A, B](t: Table[A, B]; key: A): B

Возвращает значение по ключу t[key], если key есть в t. В противном случае возвращается значение по умолчанию для типа B (например, 0 для целочисленных типов).

См. также:

  • процедуру [] для получения значения по ключу
  • процедуру hasKey
  • процедуру hasKeyOrPut
  • процедуру mgetOrPut
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert a.getOrDefault('a') == 5
doAssert a.getOrDefault('z') == 0
Исходный код Изменить
proc getOrDefault[A, B](t: Table[A, B]; key: A; default: B): B

Возвращает значение по ключу t[key], если key есть в t. В противном случае возвращается default.

См. также:

  • процедуру [] для получения значения по ключу
  • процедуру hasKey
  • процедуру hasKeyOrPut
  • процедуру mgetOrPut
  • процедуру getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Исходный код Изменить
proc mgetOrPut[A, B](t: var Table[A, B]; key: A; val: B): var B

Возвращает значение по ключу t[key] или вставляет val, если ключ отсутствует, в любом случае возвращая значение, которое можно изменить.

Обратите внимание, что, хотя возвращаемое значение имеет тип var B, легко случайно создать копию значения по ключу t[key]. Помните, что последовательности и строки являются значениями, и поэтому их нельзя скопировать в отдельную переменную для изменения. См. пример ниже.

См. также:

  • процедуру [] для получения значения по ключу
  • процедуру hasKey
  • процедуру hasKeyOrPut
  • процедуру getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

var a = {'a': 5, 'b': 9}.toTable
doAssert a.mgetOrPut('a', 99) == 5
doAssert a.mgetOrPut('z', 99) == 99
doAssert a == {'a': 5, 'b': 9, 'z': 99}.toTable

# An example of accidentally creating a copy
var t = initTable[int, seq[int]]()
# In this example, we expect t[10] to be modified,
# but it is not.
var copiedSeq = t.mgetOrPut(10, @[10])
copiedSeq.add(20)
doAssert t[10] == @[10]
# Correct
t.mgetOrPut(25, @[25]).add(35)
doAssert t[25] == @[25, 35]
Исходный код Изменить
proc len[A, B](t: Table[A, B]): int
Возвращает количество ключей в t.

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert len(a) == 2
Исходный код Изменить
proc add[A, B](t: var Table[A, B]; key: A; val: sink B) {...}{.deprecated: "Deprecated since v1.4; it was more confusing than useful, use `[]=`".}
Устаревшее: Устаревшее начиная с v1.4; вызывало больше путаницы, чем пользы, используйте `[]=`

Добавляет новую пару (key, value) в t даже если t[key] уже существует.

Это может привести к дублированию ключей в таблице!

Используйте []= proc для добавления новой пары (ключ, значение) в таблицу без создания дубликатов.

Исходный код Изменить
proc del[A, B](t: var Table[A, B]; key: A)

Удаляет key из хеш-таблицы t. Ничего не делает, если ключ не существует.

См. также:

  • pop proc
  • clear proc для очистки всей таблицы

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.toTable
a.del('a')
doAssert a == {'b': 9, 'c': 13}.toTable
a.del('z')
doAssert a == {'b': 9, 'c': 13}.toTable
Исходный код Изменить
proc pop[A, B](t: var Table[A, B]; key: A; val: var B): bool

Удаляет key из таблицы. Возвращает true, если key существовал, и устанавливает val в отображение ключа. В противном случае возвращает false, и val остается без изменений.

См. также:

  • del proc
  • clear proc для очистки всей таблицы

Пример:

var
  a = {'a': 5, 'b': 9, 'c': 13}.toTable
  i: int
doAssert a.pop('b', i) == true
doAssert a == {'a': 5, 'c': 13}.toTable
doAssert i == 9
i = 0
doAssert a.pop('z', i) == false
doAssert a == {'a': 5, 'c': 13}.toTable
doAssert i == 0
Исходный код Изменить
proc take[A, B](t: var Table[A, B]; key: A; val: var B): bool {...}{.inline.}
Псевдоним для:
  • pop proc
Исходный код Изменить
proc clear[A, B](t: var Table[A, B])

Сбрасывает таблицу, делая ее пустой.

См. также:

  • del proc
  • pop proc

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.toTable
doAssert len(a) == 3
clear(a)
doAssert len(a) == 0
Исходный код Изменить
proc `$`[A, B](t: Table[A, B]): string
Оператор $ для хеш-таблиц. Используется внутренне при вызове echo для таблицы. Исходный код Изменить
proc `==`[A, B](s, t: Table[A, B]): bool
Оператор == для хеш-таблиц. Возвращает true, если содержимое обеих таблиц содержит одинаковые пары ключ-значение. Порядок вставки не имеет значения.

Пример:

let
  a = {'a': 5, 'b': 9, 'c': 13}.toTable
  b = {'b': 9, 'c': 13, 'a': 5}.toTable
doAssert a == b
Исходный код Изменить
proc indexBy[A, B, C](collection: A; index: proc (x: B): C): Table[C, B]
Индексация коллекции с помощью предоставленного proc. Исходный код Изменить
proc newTable[A, B](initialSize = defaultInitialSize): TableRef[A, B]

Создает новую ссылочную хеш-таблицу, которая является пустой.

См. также:

  • newTable proc для создания TableRef из коллекции пар (key, value)
  • initTable proc для создания Table

Пример:

let
  a = newTable[int, string]()
  b = newTable[char, seq[int]]()
Исходный код Изменить
proc newTable[A, B](pairs: openArray[(A, B)]): TableRef[A, B]

Создает новую ссылочную хеш-таблицу, содержащую заданные pairs.

pairs — это контейнер, состоящий из кортежей (key, value).

См. также:

  • newTable proc
  • toTable proc для варианта Table

Пример:

let a = [('a', 5), ('b', 9)]
let b = newTable(a)
assert b == {'a': 5, 'b': 9}.newTable
Исходный код Изменить
proc newTableFrom[A, B, C](collection: A; index: proc (x: B): C): TableRef[C, B]
Индексация коллекции с помощью предоставленного proc. Исходный код Изменить
proc `[]`[A, B](t: TableRef[A, B]; key: A): var B

Возвращает значение по t[key].

Если key отсутствует в t, возникает исключение KeyError . Можно проверить существование ключа с помощью hasKey proc.

См. также:

  • getOrDefault proc для возвращения значения по умолчанию (например, нуля для int), если ключ не существует
  • getOrDefault proc для возвращения пользовательского значения, если ключ не существует
  • []= proc для добавления новой пары (ключ, значение) в таблицу
  • hasKey proc для проверки наличия ключа в таблице

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert a['a'] == 5
doAssertRaises(KeyError):
  echo a['z']
Исходный код Изменить
proc `[]=`[A, B](t: TableRef[A, B]; key: A; val: sink B)

Вставляет пару (key, value) в t.

См. также:

  • [] proc для получения значения по ключу
  • hasKeyOrPut proc
  • mgetOrPut proc
  • del proc для удаления ключа из таблицы

Пример:

var a = newTable[char, int]()
a['x'] = 7
a['y'] = 33
doAssert a == {'x': 7, 'y': 33}.newTable
Исходный код Изменить
proc hasKey[A, B](t: TableRef[A, B]; key: A): bool

Возвращает true, если key присутствует в таблице t.

См. также:

  • contains proc для использования с оператором in
  • [] proc для получения значения по ключу
  • getOrDefault proc для возвращения значения по умолчанию (например, нуля для int), если ключ не существует
  • getOrDefault proc для возвращения пользовательского значения, если ключ не существует

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert a.hasKey('a') == true
doAssert a.hasKey('z') == false
Исходный код Изменить
proc contains[A, B](t: TableRef[A, B]; key: A): bool
Псевдоним hasKey proc для использования с оператором in.

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert 'b' in a == true
doAssert a.contains('z') == false
Исходный код Изменить
proc hasKeyOrPut[A, B](t: var TableRef[A, B]; key: A; val: B): bool

Возвращает true, если key находится в таблице, иначе вставляет value.

См. также:

  • hasKey proc
  • [] proc для получения значения по ключу
  • getOrDefault proc для возвращения значения по умолчанию (например, нуля для int), если ключ не существует
  • getOrDefault proc для возвращения пользовательского значения, если ключ не существует

Пример:

var a = {'a': 5, 'b': 9}.newTable
if a.hasKeyOrPut('a', 50):
  a['a'] = 99
if a.hasKeyOrPut('z', 50):
  a['z'] = 99
doAssert a == {'a': 99, 'b': 9, 'z': 50}.newTable
Исходный код Изменить
proc getOrDefault[A, B](t: TableRef[A, B]; key: A): B

Возвращает значение по t[key] если key присутствует в t. В противном случае возвращается значение инициализации по умолчанию для типа B (например, 0 для любого целочисленного типа).

См. также:

  • [] proc для получения значения по ключу
  • hasKey proc
  • hasKeyOrPut proc
  • mgetOrPut proc
  • getOrDefault proc для возвращения пользовательского значения, если ключ не существует

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert a.getOrDefault('a') == 5
doAssert a.getOrDefault('z') == 0
Исходный код Изменить
proc getOrDefault[A, B](t: TableRef[A, B]; key: A; default: B): B

Возвращает значение по ключу t[key] если key присутствует в t. В противном случае возвращается default.

См. также:

  • [] proc для получения значения по ключу
  • hasKey proc
  • hasKeyOrPut proc
  • mgetOrPut proc
  • getOrDefault proc для возврата значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Исходный код Редактировать
proc mgetOrPut[A, B](t: TableRef[A, B]; key: A; val: B): var B

Возвращает значение по ключу t[key] или вставляет val, если ключ отсутствует, в любом случае возвращая значение, которое можно изменить.

Обратите внимание, что хотя возвращаемое значение имеет тип var B, легко случайно создать копию значения по ключу t[key]. Помните, что последовательности (seqs) и строки являются значениями, и поэтому их нельзя скопировать в отдельную переменную для изменения. См. пример ниже.

См. также:

  • [] proc для получения значения по ключу
  • hasKey proc
  • hasKeyOrPut proc
  • getOrDefault proc для возврата значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • getOrDefault proc для возврата пользовательского значения, если ключ отсутствует

Пример:

var a = {'a': 5, 'b': 9}.newTable
doAssert a.mgetOrPut('a', 99) == 5
doAssert a.mgetOrPut('z', 99) == 99
doAssert a == {'a': 5, 'b': 9, 'z': 99}.newTable

# An example of accidentally creating a copy
var t = newTable[int, seq[int]]()
# In this example, we expect t[10] to be modified,
# but it is not.
var copiedSeq = t.mgetOrPut(10, @[10])
copiedSeq.add(20)
doAssert t[10] == @[10]
# Correct
t.mgetOrPut(25, @[25]).add(35)
doAssert t[25] == @[25, 35]
Исходный код Редактировать
proc len[A, B](t: TableRef[A, B]): int
Возвращает количество ключей в t.

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert len(a) == 2
Исходный код Редактировать
proc add[A, B](t: TableRef[A, B]; key: A; val: sink B) {...}{.deprecated: "Deprecated since v1.4; it was more confusing than useful, use `[]=`".}
Устарело: Устарело начиная с v1.4; было более запутанным, чем полезным, используйте `[]=`

Вставляет новую пару (key, value) в t, даже если t[key] уже существует.

Это может добавить дубликаты ключей в таблицу!

Используйте []= proc для вставки новой пары (ключ, значение) в таблицу без дубликатов.

Исходный код Редактировать
proc del[A, B](t: TableRef[A, B]; key: A)

Удаляет key из хеш-таблицы t. Ничего не делает, если ключ не существует.

Если были добавлены дубликаты ключей, может потребоваться вызвать эту функцию несколько раз.

См. также:

  • pop proc
  • clear proc для очистки всей таблицы

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.newTable
a.del('a')
doAssert a == {'b': 9, 'c': 13}.newTable
a.del('z')
doAssert a == {'b': 9, 'c': 13}.newTable
Исходный код Редактировать
proc pop[A, B](t: TableRef[A, B]; key: A; val: var B): bool

Удаляет key из таблицы. Возвращает true, если key существовало, и устанавливает val в отображение ключа. В противном случае возвращает false, и val остается неизменным.

Если были добавлены дубликаты ключей, может потребоваться вызвать эту функцию несколько раз.

См. также:

  • del proc
  • clear proc для очистки всей таблицы

Пример:

var
  a = {'a': 5, 'b': 9, 'c': 13}.newTable
  i: int
doAssert a.pop('b', i) == true
doAssert a == {'a': 5, 'c': 13}.newTable
doAssert i == 9
i = 0
doAssert a.pop('z', i) == false
doAssert a == {'a': 5, 'c': 13}.newTable
doAssert i == 0
Исходный код Редактировать
proc take[A, B](t: TableRef[A, B]; key: A; val: var B): bool {...}{.inline.}
Псевдоним для:
  • pop proc
Исходный код Редактировать
proc clear[A, B](t: TableRef[A, B])

Сбрасывает таблицу в пустое состояние.

См. также:

  • del proc
  • pop proc

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.newTable
doAssert len(a) == 3
clear(a)
doAssert len(a) == 0
Исходный код Редактировать
proc `$`[A, B](t: TableRef[A, B]): string
Оператор $ для хеш-таблиц. Используется внутри при вызове echo на таблице. Исходный код Редактировать
proc `==`[A, B](s, t: TableRef[A, B]): bool
Оператор == для хеш-таблиц. Возвращает true, если обе таблицы nil, или ни одна из них не nil, и содержимое обеих таблиц содержит одинаковые пары ключ-значение. Порядок вставки не имеет значения.

Пример:

let
  a = {'a': 5, 'b': 9, 'c': 13}.newTable
  b = {'b': 9, 'c': 13, 'a': 5}.newTable
doAssert a == b
Исходный код Редактировать
proc initOrderedTable[A, B](initialSize = defaultInitialSize): OrderedTable[A, B]

Создаёт новую упорядоченную хеш-таблицу, которая пуста.

Начиная с Nim v0.20, таблицы инициализируются по умолчанию, и нет необходимости вызывать эту функцию явно.

См. также:

  • toOrderedTable proc
  • newOrderedTable proc для создания OrderedTableRef

Пример:

let
  a = initOrderedTable[int, string]()
  b = initOrderedTable[char, seq[int]]()
Исходный код Редактировать
proc `[]=`[A, B](t: var OrderedTable[A, B]; key: A; val: sink B)

Вставляет пару (key, value) в t.

См. также:

  • [] proc для получения значения по ключу
  • hasKeyOrPut proc
  • mgetOrPut proc
  • del proc для удаления ключа из таблицы

Пример:

var a = initOrderedTable[char, int]()
a['x'] = 7
a['y'] = 33
doAssert a == {'x': 7, 'y': 33}.toOrderedTable
Исходный код Редактировать
proc toOrderedTable[A, B](pairs: openArray[(A, B)]): OrderedTable[A, B]

Создаёт новую упорядоченную хеш-таблицу, содержащую заданные pairs.

pairs — контейнер, состоящий из кортежей (key, value).

См. также:

  • initOrderedTable proc
  • newOrderedTable proc для версии OrderedTableRef

Пример:

let a = [('a', 5), ('b', 9)]
let b = toOrderedTable(a)
assert b == {'a': 5, 'b': 9}.toOrderedTable
Исходный код Редактировать
proc `[]`[A, B](t: OrderedTable[A, B]; key: A): B

Возвращает значение по ключу t[key].

Если key не в t, генерируется исключение KeyError. Можно проверить существование ключа с помощью hasKey proc.

См. также:

  • getOrDefault proc для возврата значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • getOrDefault proc для возврата пользовательского значения, если ключ отсутствует
  • []= proc для вставки новой пары (ключ, значение) в таблицу
  • hasKey proc для проверки наличия ключа в таблице

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert a['a'] == 5
doAssertRaises(KeyError):
  echo a['z']
Исходный код Редактировать
proc `[]`[A, B](t: var OrderedTable[A, B]; key: A): var B

Возвращает значение по ключу t[key]. Значение можно изменить.

Если key не в t, генерируется исключение KeyError.

См. также:

  • getOrDefault proc для возврата значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • getOrDefault proc для возврата пользовательского значения, если ключ отсутствует
  • []= proc для вставки новой пары (ключ, значение) в таблицу
  • hasKey proc для проверки наличия ключа в таблице
Исходный код Редактировать
proc hasKey[A, B](t: OrderedTable[A, B]; key: A): bool

Возвращает true, если key содержится в таблице t.

См. также:

  • процедура contains для использования с оператором in
  • процедура [] для извлечения значения по ключу
  • процедура getOrDefault для возвращения значения по умолчанию (например, 0 для целых чисел), если ключ не существует
  • процедура getOrDefault для возвращения пользовательского значения, если ключ не существует

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert a.hasKey('a') == true
doAssert a.hasKey('z') == false
Исходный код Изменить
proc contains[A, B](t: OrderedTable[A, B]; key: A): bool
Псевдоним процедуры hasKey для использования с оператором in.

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert 'b' in a == true
doAssert a.contains('z') == false
Исходный код Изменить
proc hasKeyOrPut[A, B](t: var OrderedTable[A, B]; key: A; val: B): bool

Возвращает true, если key содержится в таблице, в противном случае вставляет value.

См. также:

  • процедура hasKey
  • процедура [] для извлечения значения по ключу
  • процедура getOrDefault для возвращения значения по умолчанию (например, 0 для целых чисел), если ключ не существует
  • процедура getOrDefault для возвращения пользовательского значения, если ключ не существует

Пример:

var a = {'a': 5, 'b': 9}.toOrderedTable
if a.hasKeyOrPut('a', 50):
  a['a'] = 99
if a.hasKeyOrPut('z', 50):
  a['z'] = 99
doAssert a == {'a': 99, 'b': 9, 'z': 50}.toOrderedTable
Исходный код Изменить
proc getOrDefault[A, B](t: OrderedTable[A, B]; key: A): B

Возвращает значение по t[key] если key содержится в t . В противном случае возвращается значение по умолчанию для типа B (например, 0 для любого целочисленного типа).

См. также:

  • процедура [] для извлечения значения по ключу
  • процедура hasKey
  • процедура hasKeyOrPut
  • процедура mgetOrPut
  • процедура getOrDefault для возвращения пользовательского значения, если ключ не существует

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert a.getOrDefault('a') == 5
doAssert a.getOrDefault('z') == 0
Исходный код Изменить
proc getOrDefault[A, B](t: OrderedTable[A, B]; key: A; default: B): B

Возвращает значение по t[key] если key содержится в t . В противном случае возвращается default.

См. также:

  • процедура [] для извлечения значения по ключу
  • процедура hasKey
  • процедура hasKeyOrPut
  • процедура mgetOrPut
  • процедура getOrDefault для возвращения значения по умолчанию (например, 0 для целых чисел), если ключ не существует

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Исходный код Изменить
proc mgetOrPut[A, B](t: var OrderedTable[A, B]; key: A; val: B): var B

Возвращает значение по t[key] или вставляет val если оно отсутствует, в любом случае возвращает значение, которое можно изменить.

См. также:

  • процедура [] для извлечения значения по ключу
  • процедура hasKey
  • процедура hasKeyOrPut
  • процедура getOrDefault для возвращения значения по умолчанию (например, 0 для целых чисел), если ключ не существует
  • процедура getOrDefault для возвращения пользовательского значения, если ключ не существует

Пример:

var a = {'a': 5, 'b': 9}.toOrderedTable
doAssert a.mgetOrPut('a', 99) == 5
doAssert a.mgetOrPut('z', 99) == 99
doAssert a == {'a': 5, 'b': 9, 'z': 99}.toOrderedTable
Исходный код Изменить
proc len[A, B](t: OrderedTable[A, B]): int {...}{.inline.}
Возвращает количество ключей в t.

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert len(a) == 2
Исходный код Изменить
proc add[A, B](t: var OrderedTable[A, B]; key: A; val: sink B) {...}{.deprecated: "Deprecated since v1.4; it was more confusing than useful, use `[]=`".}
Устаревшее: Устаревшее с версии v1.4; было более запутанным, чем полезным, используйте `[]=`

Добавляет новую пару (key, value) в t , даже если t[key] уже существует.

Это может привести к появлению дублирующих ключей в таблице!

Используйте процедуру []= для вставки новой пары (ключ, значение) в таблицу без дублирования.

Исходный код Изменить
proc del[A, B](t: var OrderedTable[A, B]; key: A)

Удаляет key из хеш-таблицы t . Ничего не делает, если ключ не существует.

Сложность O(n).

См. также:

  • процедура pop
  • процедура clear для очистки всей таблицы

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.toOrderedTable
a.del('a')
doAssert a == {'b': 9, 'c': 13}.toOrderedTable
a.del('z')
doAssert a == {'b': 9, 'c': 13}.toOrderedTable
Исходный код Изменить
proc pop[A, B](t: var OrderedTable[A, B]; key: A; val: var B): bool

Удаляет key из таблицы. Возвращает true, если key существовало, и устанавливает val в сопоставление ключа. В противном случае возвращает false, и val не изменяется.

Сложность O(n).

См. также:

  • процедура del
  • процедура clear для очистки всей таблицы

Пример:

var
  a = {'c': 5, 'b': 9, 'a': 13}.toOrderedTable
  i: int
doAssert a.pop('b', i) == true
doAssert a == {'c': 5, 'a': 13}.toOrderedTable
doAssert i == 9
i = 0
doAssert a.pop('z', i) == false
doAssert a == {'c': 5, 'a': 13}.toOrderedTable
doAssert i == 0
Исходный код Изменить
proc clear[A, B](t: var OrderedTable[A, B])

Сбрасывает таблицу, делая её пустой.

См. также:

  • процедура del
  • процедура pop

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.toOrderedTable
doAssert len(a) == 3
clear(a)
doAssert len(a) == 0
Исходный код Изменить
proc sort[A, B](t: var OrderedTable[A, B]; cmp: proc (x, y: (A, B)): int;
                order = SortOrder.Ascending)

Сортирует t в соответствии с функцией cmp.

Это изменяет внутренний список, сохраняющий порядок вставки, поэтому порядок вставки теряется после этого вызова, но поиск ключей и вставки остаются возможными после sort (в отличие от процедуры sort для таблиц подсчета).

Пример:

import algorithm
var a = initOrderedTable[char, int]()
for i, c in "cab":
  a[c] = 10*i
doAssert a == {'c': 0, 'a': 10, 'b': 20}.toOrderedTable
a.sort(system.cmp)
doAssert a == {'a': 10, 'b': 20, 'c': 0}.toOrderedTable
a.sort(system.cmp, order = SortOrder.Descending)
doAssert a == {'c': 0, 'b': 20, 'a': 10}.toOrderedTable
Исходный код Изменить
proc `$`[A, B](t: OrderedTable[A, B]): string
Оператор $ для упорядоченных хеш-таблиц. Используется внутри при вызове echo для таблицы. Исходный код Изменить
proc `==`[A, B](s, t: OrderedTable[A, B]): bool
Оператор == для упорядоченных хеш-таблиц. Возвращает true , если содержимое и порядок равны.

Пример:

let
  a = {'a': 5, 'b': 9, 'c': 13}.toOrderedTable
  b = {'b': 9, 'c': 13, 'a': 5}.toOrderedTable
doAssert a != b
Исходный код Изменить
proc newOrderedTable[A, B](initialSize = defaultInitialSize): OrderedTableRef[A,
    B]

Создаёт новую пустую упорядоченную ссылку на хеш-таблицу.

См. также:

  • процедура newOrderedTable для создания OrderedTableRef из набора пар (key, value)
  • процедура initOrderedTable для создания OrderedTable

Пример:

let
  a = newOrderedTable[int, string]()
  b = newOrderedTable[char, seq[int]]()
Исходный код Изменить
proc newOrderedTable[A, B](pairs: openArray[(A, B)]): OrderedTableRef[A, B]

Создаёт новую упорядоченную таблицу ссылок, которая содержит заданные pairs.

pairs — это контейнер, состоящий из (key, value) кортежей.

См. также:

  • процедура newOrderedTable
  • процедура toOrderedTable для OrderedTable версии

Пример:

let a = [('a', 5), ('b', 9)]
let b = newOrderedTable(a)
assert b == {'a': 5, 'b': 9}.newOrderedTable
Исходный код Редактировать
proc `[]`[A, B](t: OrderedTableRef[A, B]; key: A): var B

Возвращает значение по t[key].

Если key отсутствует в t, возникает исключение KeyError. Можно проверить наличие ключа с помощью процедуры hasKey.

См. также:

  • процедура getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует
  • процедура []= для вставки новой пары (ключ, значение) в таблицу
  • процедура hasKey для проверки наличия ключа в таблице

Пример:

let a = {'a': 5, 'b': 9}.newOrderedTable
doAssert a['a'] == 5
doAssertRaises(KeyError):
  echo a['z']
Исходный код Редактировать
proc `[]=`[A, B](t: OrderedTableRef[A, B]; key: A; val: sink B)

Вставляет пару (key, value) в t.

См. также:

  • процедура [] для получения значения по ключу
  • процедура hasKeyOrPut
  • процедура mgetOrPut
  • процедура del для удаления ключа из таблицы

Пример:

var a = newOrderedTable[char, int]()
a['x'] = 7
a['y'] = 33
doAssert a == {'x': 7, 'y': 33}.newOrderedTable
Исходный код Редактировать
proc hasKey[A, B](t: OrderedTableRef[A, B]; key: A): bool

Возвращает true, если key содержится в таблице t.

См. также:

  • процедура contains для использования с оператором in
  • процедура [] для получения значения по ключу
  • процедура getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

let a = {'a': 5, 'b': 9}.newOrderedTable
doAssert a.hasKey('a') == true
doAssert a.hasKey('z') == false
Исходный код Редактировать
proc contains[A, B](t: OrderedTableRef[A, B]; key: A): bool
Псевдоним процедуры hasKey для использования с оператором in.

Пример:

let a = {'a': 5, 'b': 9}.newOrderedTable
doAssert 'b' in a == true
doAssert a.contains('z') == false
Исходный код Редактировать
proc hasKeyOrPut[A, B](t: var OrderedTableRef[A, B]; key: A; val: B): bool

Возвращает true, если key есть в таблице, иначе вставляет value.

См. также:

  • процедура hasKey
  • процедура [] для получения значения по ключу
  • процедура getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

var a = {'a': 5, 'b': 9}.newOrderedTable
if a.hasKeyOrPut('a', 50):
  a['a'] = 99
if a.hasKeyOrPut('z', 50):
  a['z'] = 99
doAssert a == {'a': 99, 'b': 9, 'z': 50}.newOrderedTable
Исходный код Редактировать
proc getOrDefault[A, B](t: OrderedTableRef[A, B]; key: A): B

Возвращает значение по t[key], если key есть в t. В противном случае возвращается значение по умолчанию для типа B (например, 0 для целых типов).

См. также:

  • процедура [] для получения значения по ключу
  • процедура hasKey
  • процедура hasKeyOrPut
  • процедура mgetOrPut
  • процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

let a = {'a': 5, 'b': 9}.newOrderedTable
doAssert a.getOrDefault('a') == 5
doAssert a.getOrDefault('z') == 0
Исходный код Редактировать
proc getOrDefault[A, B](t: OrderedTableRef[A, B]; key: A; default: B): B

Возвращает значение по t[key], если key есть в t. В противном случае возвращается default.

См. также:

  • процедура [] для получения значения по ключу
  • процедура hasKey
  • процедура hasKeyOrPut
  • процедура mgetOrPut
  • процедура getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует

Пример:

let a = {'a': 5, 'b': 9}.newOrderedTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Исходный код Редактировать
proc mgetOrPut[A, B](t: OrderedTableRef[A, B]; key: A; val: B): var B

Возвращает значение по t[key] или вставляет val, если оно отсутствует, возвращая изменяемое значение.

См. также:

  • процедура [] для получения значения по ключу
  • процедура hasKey
  • процедура hasKeyOrPut
  • процедура getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ отсутствует
  • процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует

Пример:

var a = {'a': 5, 'b': 9}.newOrderedTable
doAssert a.mgetOrPut('a', 99) == 5
doAssert a.mgetOrPut('z', 99) == 99
doAssert a == {'a': 5, 'b': 9, 'z': 99}.newOrderedTable
Исходный код Редактировать
proc len[A, B](t: OrderedTableRef[A, B]): int {...}{.inline.}
Возвращает количество ключей в t.

Пример:

let a = {'a': 5, 'b': 9}.newOrderedTable
doAssert len(a) == 2
Исходный код Редактировать
proc add[A, B](t: OrderedTableRef[A, B]; key: A; val: sink B) {...}{.deprecated: "Deprecated since v1.4; it was more confusing than useful, use `[]=`".}
Устаревшее: Устарело начиная с версии v1.4; оно было более запутанным, чем полезным, используйте `[]=`

Вставляет новую пару (key, value) в t даже если t[key] уже существует.

Это может привести к появлению дублирующихся ключей в таблице!

Используйте процедуру []= для вставки новой пары (ключ, значение) в таблицу без создания дубликатов.

Исходный код Редактировать
proc del[A, B](t: OrderedTableRef[A, B]; key: A)

Удаляет key из хеш-таблицы t. Ничего не делает, если ключ не существует.

См. также:

  • процедура clear для очистки всей таблицы

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.newOrderedTable
a.del('a')
doAssert a == {'b': 9, 'c': 13}.newOrderedTable
a.del('z')
doAssert a == {'b': 9, 'c': 13}.newOrderedTable
Исходный код Редактировать
proc pop[A, B](t: OrderedTableRef[A, B]; key: A; val: var B): bool

Удаляет key из таблицы. Возвращает true, если key существовала, и устанавливает val на отображение ключа. В противном случае возвращает false, и val не меняется.

См. также:

  • процедура del
  • процедура clear для очистки всей таблицы

Пример:

var
  a = {'c': 5, 'b': 9, 'a': 13}.newOrderedTable
  i: int
doAssert a.pop('b', i) == true
doAssert a == {'c': 5, 'a': 13}.newOrderedTable
doAssert i == 9
i = 0
doAssert a.pop('z', i) == false
doAssert a == {'c': 5, 'a': 13}.newOrderedTable
doAssert i == 0
Исходный код Редактировать
proc clear[A, B](t: OrderedTableRef[A, B])

Сбрасывает таблицу, делая её пустой.

См. также:

  • процедура del

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.newOrderedTable
doAssert len(a) == 3
clear(a)
doAssert len(a) == 0
Исходный код Редактировать
proc sort[A, B](t: OrderedTableRef[A, B]; cmp: proc (x, y: (A, B)): int;
                order = SortOrder.Ascending)

Сортирует t в соответствии с функцией cmp.

Это изменяет внутренний список, который сохранял порядок вставки, поэтому порядок вставки теряется после этого вызова, но поиск ключей и вставки остаются возможными после sort (в отличие от процедуры сортировки sort proc для таблиц подсчёта).

Пример:

import algorithm
var a = newOrderedTable[char, int]()
for i, c in "cab":
  a[c] = 10*i
doAssert a == {'c': 0, 'a': 10, 'b': 20}.newOrderedTable
a.sort(system.cmp)
doAssert a == {'a': 10, 'b': 20, 'c': 0}.newOrderedTable
a.sort(system.cmp, order = SortOrder.Descending)
doAssert a == {'c': 0, 'b': 20, 'a': 10}.newOrderedTable
Исходный код Редактировать
proc `$`[A, B](t: OrderedTableRef[A, B]): string
Оператор $ для хеш-таблиц. Используется во внутреннем вызове echo для таблицы. Исходный код Редактировать
proc `==`[A, B](s, t: OrderedTableRef[A, B]): bool
Оператор == для упорядоченных хеш-таблиц. Возвращает true, если обе таблицы являются nil, или если ни одна из них не является nil и содержание и порядок обеих таблиц равны.

Пример:

let
  a = {'a': 5, 'b': 9, 'c': 13}.newOrderedTable
  b = {'b': 9, 'c': 13, 'a': 5}.newOrderedTable
doAssert a != b
Исходный код Редактировать
proc initCountTable[A](initialSize = defaultInitialSize): CountTable[A]

Создаёт новую пустую таблицу подсчёта.

Начиная с Nim v0.20, таблицы инициализируются по умолчанию, и вызывать эту функцию явно не требуется.

См. также:

  • процедура toCountTable
  • процедура newCountTable для создания CountTableRef
Исходный код Редактировать
proc toCountTable[A](keys: openArray[A]): CountTable[A]
Создаёт новую таблицу подсчёта с количеством вхождений каждого элемента из контейнера keys в этом контейнере. Исходный код Редактировать
proc `[]`[A](t: CountTable[A]; key: A): int

Возвращает значение по ключу t[key], если key содержится в t. В противном случае возвращается 0.

См. также:

  • getOrDefault для возвращения пользовательского значения, если ключ отсутствует
  • []= proc для вставки новой пары (ключ, значение) в таблицу
  • hasKey proc для проверки наличия ключа в таблице
Исходный код Редактировать
proc `[]=`[A](t: var CountTable[A]; key: A; val: int)

Вставляет пару (key, value) в t.

См. также:

  • [] proc для получения значения по ключу
  • inc proc для увеличения значения по ключу
Исходный код Редактировать
proc inc[A](t: var CountTable[A]; key: A; val = 1)
Увеличивает t[key] на val (по умолчанию: 1).

Пример:

var a = toCountTable("aab")
a.inc('a')
a.inc('b', 10)
doAssert a == toCountTable("aaabbbbbbbbbbb")
Исходный код Редактировать
proc len[A](t: CountTable[A]): int
Возвращает количество ключей в t. Исходный код Редактировать
proc smallest[A](t: CountTable[A]): tuple[key: A, val: int]

Возвращает пару (key, value) с наименьшим val. Эффективность: O(n)

См. также:

  • процедура largest
Исходный код Редактировать
proc largest[A](t: CountTable[A]): tuple[key: A, val: int]

Возвращает пару (key, value) с наибольшим val. Эффективность: O(n)

См. также:

  • процедура smallest
Исходный код Редактировать
proc hasKey[A](t: CountTable[A]; key: A): bool

Возвращает true, если key содержится в таблице t.

См. также:

  • процедура contains для использования с оператором in
  • [] proc для получения значения по ключу
  • процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует
Исходный код Редактировать
proc contains[A](t: CountTable[A]; key: A): bool
Псевдоним для процедуры hasKey для использования с оператором in. Исходный код Редактировать
proc getOrDefault[A](t: CountTable[A]; key: A; default: int = 0): int

Возвращает значение по ключу t[key], если key содержится в t. В противном случае возвращается целочисленное значение default.

См. также:

  • [] proc для получения значения по ключу
  • hasKey proc для проверки наличия ключа в таблице
Исходный код Редактировать
proc del[A](t: var CountTable[A]; key: A)

Удаляет key из таблицы t . Ничего не делает, если ключ отсутствует.

См. также:

  • процедура pop
  • процедура clear для очистки всей таблицы

Пример:

var a = toCountTable("aabbbccccc")
a.del('b')
assert a == toCountTable("aaccccc")
a.del('b')
assert a == toCountTable("aaccccc")
a.del('c')
assert a == toCountTable("aa")
Исходный код Редактировать
proc pop[A](t: var CountTable[A]; key: A; val: var int): bool

Удаляет key из таблицы. Возвращает true, если key существовало, и устанавливает val в отображение ключа. В противном случае возвращает false, и val остаётся неизменным.

См. также:

  • процедура del
  • процедура clear для очистки всей таблицы

Пример:

var a = toCountTable("aabbbccccc")
var i = 0
assert a.pop('b', i)
assert i == 3
i = 99
assert not a.pop('b', i)
assert i == 99
Исходный код Редактировать
proc clear[A](t: var CountTable[A])

Обнуляет таблицу, делая её пустой.

См. также:

  • процедура del
  • процедура pop
Исходный код Редактировать
proc sort[A](t: var CountTable[A]; order = SortOrder.Descending)

Сортирует таблицу подсчёта, чтобы, по умолчанию, запись с наибольшим счётчиком шла первой.

ПРЕДУПРЕЖДЕНИЕ: Это разрушающая операция! После сортировки нельзя изменять t!

Можно использовать итераторы pairs, keys и values для перебора t в отсортированном порядке.

Пример:

import algorithm, sequtils
var a = toCountTable("abracadabra")
doAssert a == "aaaaabbrrcd".toCountTable
a.sort()
doAssert toSeq(a.values) == @[5, 2, 2, 1, 1]
a.sort(SortOrder.Ascending)
doAssert toSeq(a.values) == @[1, 1, 2, 2, 5]
Исходный код Редактировать
proc merge[A](s: var CountTable[A]; t: CountTable[A])
Объединяет вторую таблицу в первую (должна быть объявлена как var).

Пример:

var a = toCountTable("aaabbc")
let b = toCountTable("bcc")
a.merge(b)
doAssert a == toCountTable("aaabbbccc")
Исходный код Редактировать
proc `$`[A](t: CountTable[A]): string
Оператор $ для таблиц подсчёта. Используется во внутреннем вызове echo для таблицы. Исходный код Редактировать
proc `==`[A](s, t: CountTable[A]): bool
Оператор == для таблиц подсчета. Возвращает true , если обе таблицы содержат одинаковые ключи с одинаковым количеством. Порядок вставки не имеет значения. Исходный код Изменить
proc newCountTable[A](initialSize = defaultInitialSize): CountTableRef[A]

Создаёт новую пустую таблицу подсчёта ссылок.

См. также:

  • процедура newCountTable для создания таблицы из коллекции
  • процедура initCountTable для создания пустой таблицы
Исходный код Изменить
proc newCountTable[A](keys: openArray[A]): CountTableRef[A]
Создаёт новую таблицу подсчёта ссылок, где каждый элемент контейнера keys имеет счётчик, указывающий на количество его вхождений в контейнер. Исходный код Изменить
proc `[]`[A](t: CountTableRef[A]; key: A): int

Возвращает значение по ключу t[key] , если key присутствует в t. Иначе возвращается 0.

См. также:

  • getOrDefault для возвращения пользовательского значения, если ключ отсутствует
  • процедура inc для увеличения значения даже при отсутствии ключа
  • процедура []= для добавления новой пары (ключ, значение) в таблицу
  • процедура hasKey для проверки наличия ключа в таблице
Исходный код Изменить
proc `[]=`[A](t: CountTableRef[A]; key: A; val: int)

Вставляет пару (key, value) в t.

См. также:

  • процедура [] для получения значения по ключу
  • процедура inc для увеличения значения по ключу
Исходный код Изменить
proc inc[A](t: CountTableRef[A]; key: A; val = 1)
Увеличивает t[key] на val (по умолчанию 1).

Пример:

var a = newCountTable("aab")
a.inc('a')
a.inc('b', 10)
doAssert a == newCountTable("aaabbbbbbbbbbb")
Исходный код Изменить
proc smallest[A](t: CountTableRef[A]): tuple[key: A, val: int]

Возвращает пару (key, value) с наименьшим val. Эффективность: O(n)

См. также:

  • процедура largest
Исходный код Изменить
proc largest[A](t: CountTableRef[A]): tuple[key: A, val: int]

Возвращает пару (key, value) с наибольшим val. Эффективность: O(n)

См. также:

  • процедура smallest
Исходный код Изменить
proc hasKey[A](t: CountTableRef[A]; key: A): bool

Возвращает true, если key находится в таблице t.

См. также:

  • процедура contains для использования с оператором in
  • процедура [] для получения значения по ключу
  • процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует
Исходный код Изменить
proc contains[A](t: CountTableRef[A]; key: A): bool
Псевдоним для процедуры hasKey для использования с оператором in. Исходный код Изменить
proc getOrDefault[A](t: CountTableRef[A]; key: A; default: int): int

Возвращает значение по ключу t[key] , если key находится в t. Иначе возвращает целочисленное значение default.

См. также:

  • процедура [] для получения значения по ключу
  • процедура hasKey для проверки наличия ключа в таблице
Исходный код Изменить
proc len[A](t: CountTableRef[A]): int
Возвращает количество ключей в t. Исходный код Изменить
proc del[A](t: CountTableRef[A]; key: A)

Удаляет key из таблицы t. Ничего не делает, если ключ не существует.

См. также:

  • процедура pop
  • процедура clear для очистки всей таблицы
Исходный код Изменить
proc pop[A](t: CountTableRef[A]; key: A; val: var int): bool

Удаляет key из таблицы. Возвращает true, если key существовал, и устанавливает val на сопоставление ключа. Иначе возвращает false, и val не изменяется.

См. также:

  • процедура del
  • процедура clear для очистки всей таблицы
Исходный код Изменить
proc clear[A](t: CountTableRef[A])

Сбрасывает таблицу в пустое состояние.

См. также:

  • процедура del
  • процедура pop
Исходный код Изменить
proc sort[A](t: CountTableRef[A]; order = SortOrder.Descending)

Сортирует таблицу подсчета, по умолчанию, запись с наибольшим счётчиком будет первой.

Это разрушающая операция! Вы не должны изменять `t` после этого!

Вы можете использовать итераторы pairs, keys и values для перебора t в отсортированном порядке.

Исходный код Изменить
proc merge[A](s, t: CountTableRef[A])
Объединяет вторую таблицу в первую.

Пример:

let
  a = newCountTable("aaabbc")
  b = newCountTable("bcc")
a.merge(b)
doAssert a == newCountTable("aaabbbccc")
Исходный код Изменить
proc `$`[A](t: CountTableRef[A]): string
Оператор $ для таблиц подсчёта. Используется внутри при вызове echo для таблицы. Исходный код Изменить
proc `==`[A](s, t: CountTableRef[A]): bool
Оператор == для таблиц подсчёта. Возвращает true , если обе таблицы пустые, или ни одна из них не пустая и обе содержат одинаковые ключи с одинаковым количеством. Порядок вставки не имеет значения. Исходный код Изменить

Итераторы

iterator pairs[A, B](t: Table[A, B]): (A, B)

Перебирает все пары (key, value) в таблице t.

См. также:

  • итератор mpairs
  • итератор keys
  • итератор values

Примеры:

let a = {
  'o': [1, 5, 7, 9],
  'e': [2, 4, 6, 8]
  }.toTable

for k, v in a.pairs:
  echo "key: ", k
  echo "value: ", v

# key: e
# value: [2, 4, 6, 8]
# key: o
# value: [1, 5, 7, 9]
Исходный код Изменить
iterator mpairs[A, B](t: var Table[A, B]): (A, var B)

Перебирает все пары (key, value) в таблице t (должна быть объявлена как var). Значения можно изменять.

См. также:

  • итератор pairs
  • итератор mvalues

Пример:

var a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toTable
for k, v in a.mpairs:
  v.add(v[0] + 10)
doAssert a == {'e': @[2, 4, 6, 8, 12], 'o': @[1, 5, 7, 9, 11]}.toTable
Исходный код Изменить
iterator keys[A, B](t: Table[A, B]): A

Перебирает все ключи в таблице t.

См. также:

  • итератор pairs
  • итератор values

Пример:

var a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toTable
for k in a.keys:
  a[k].add(99)
doAssert a == {'e': @[2, 4, 6, 8, 99], 'o': @[1, 5, 7, 9, 99]}.toTable
Исходный код Изменить
iterator values[A, B](t: Table[A, B]): B

Перебирает все значения в таблице t.

См. также:

  • итератор pairs
  • итератор keys
  • итератор mvalues

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toTable
for v in a.values:
  doAssert v.len == 4
Исходный код Изменить
iterator mvalues[A, B](t: var Table[A, B]): var B

Перебирает все значения в таблице t (должна быть объявлена как var). Значения можно изменять.

См. также:

  • итератор mpairs
  • итератор values

Пример:

var a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toTable
for v in a.mvalues:
  v.add(99)
doAssert a == {'e': @[2, 4, 6, 8, 99], 'o': @[1, 5, 7, 9, 99]}.toTable
Исходный код Изменить
iterator allValues[A, B](t: Table[A, B]; key: A): B {...}{.deprecated: "Deprecated since v1.4; tables with duplicated keys are deprecated".}
Устарело: Устарело начиная с v1.4; таблицы с дублирующимися ключами устарели

Перебирает все значения в таблице t , которые относятся к заданному key.

Используется, если у вас есть таблица с дублирующимися ключами (в результате использования процедуры add proc).

Пример:

import sequtils, algorithm

var a = {'a': 3, 'b': 5}.toTable
for i in 1..3: a.add('z', 10*i)
doAssert toSeq(a.pairs).sorted == @[('a', 3), ('b', 5), ('z', 10), ('z', 20), ('z', 30)]
doAssert sorted(toSeq(a.allValues('z'))) == @[10, 20, 30]
Исходный код Изменить
iterator pairs[A, B](t: TableRef[A, B]): (A, B)

Перебирает все пары (key, value) в таблице t.

См. также:

  • итератор mpairs
  • итератор keys
  • итератор values

Примеры:

let a = {
  'o': [1, 5, 7, 9],
  'e': [2, 4, 6, 8]
  }.newTable

for k, v in a.pairs:
  echo "key: ", k
  echo "value: ", v

# key: e
# value: [2, 4, 6, 8]
# key: o
# value: [1, 5, 7, 9]
Исходный код Изменить
iterator mpairs[A, B](t: TableRef[A, B]): (A, var B)

Перебирает все пары (key, value) в таблице t. Значения можно изменять.

См. также:

  • итератор pairs
  • итератор mvalues

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newTable
for k, v in a.mpairs:
  v.add(v[0] + 10)
doAssert a == {'e': @[2, 4, 6, 8, 12], 'o': @[1, 5, 7, 9, 11]}.newTable
Исходный код Изменить
iterator keys[A, B](t: TableRef[A, B]): A

Перебирает все ключи в таблице t.

См. также:

  • итератор pairs
  • итератор values

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newTable
for k in a.keys:
  a[k].add(99)
doAssert a == {'e': @[2, 4, 6, 8, 99], 'o': @[1, 5, 7, 9, 99]}.newTable
Исходный код Изменить
iterator values[A, B](t: TableRef[A, B]): B

Перебирает все значения в таблице t.

См. также:

  • итератор pairs
  • итератор keys
  • итератор mvalues

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newTable
for v in a.values:
  doAssert v.len == 4
Исходный код Изменить
iterator mvalues[A, B](t: TableRef[A, B]): var B

Перебирает все значения в таблице t. Значения можно изменять.

См. также:

  • итератор mpairs
  • итератор values

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newTable
for v in a.mvalues:
  v.add(99)
doAssert a == {'e': @[2, 4, 6, 8, 99], 'o': @[1, 5, 7, 9, 99]}.newTable
Исходный код Изменить
iterator pairs[A, B](t: OrderedTable[A, B]): (A, B)

Перебирает все пары (key, value) в таблице t в порядке вставки.

См. также:

  • итератор mpairs
  • итератор keys
  • итератор values

Примеры:

let a = {
  'o': [1, 5, 7, 9],
  'e': [2, 4, 6, 8]
  }.toOrderedTable

for k, v in a.pairs:
  echo "key: ", k
  echo "value: ", v

# key: o
# value: [1, 5, 7, 9]
# key: e
# value: [2, 4, 6, 8]
Исходный код Изменить
iterator mpairs[A, B](t: var OrderedTable[A, B]): (A, var B)

Перебирает все пары (key, value) в таблице t (должна быть объявлена как var) в порядке вставки. Значения можно изменять.

См. также:

  • итератор pairs
  • итератор mvalues

Пример:

var a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toOrderedTable
for k, v in a.mpairs:
  v.add(v[0] + 10)
doAssert a == {'o': @[1, 5, 7, 9, 11],
               'e': @[2, 4, 6, 8, 12]}.toOrderedTable
Исходный код Изменить
iterator keys[A, B](t: OrderedTable[A, B]): A

Перебирает все ключи в таблице t в порядке вставки.

См. также:

  • итератор pairs
  • итератор values

Пример:

var a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toOrderedTable
for k in a.keys:
  a[k].add(99)
doAssert a == {'o': @[1, 5, 7, 9, 99],
               'e': @[2, 4, 6, 8, 99]}.toOrderedTable
Исходный код Изменить
iterator values[A, B](t: OrderedTable[A, B]): B

Перебирает все значения в таблице t в порядке вставки.

См. также:

  • итератор pairs
  • итератор keys
  • итератор mvalues

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toOrderedTable
for v in a.values:
  doAssert v.len == 4
Исходный код Изменить
iterator mvalues[A, B](t: var OrderedTable[A, B]): var B

Перебирает все значения в таблице t (должна быть объявлена как var ) в порядке вставки. Значения можно изменять.

См. также:

  • итератор mpairs
  • итератор values

Пример:

var a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toOrderedTable
for v in a.mvalues:
  v.add(99)
doAssert a == {'o': @[1, 5, 7, 9, 99],
               'e': @[2, 4, 6, 8, 99]}.toOrderedTable
Исходный код Изменить
iterator pairs[A, B](t: OrderedTableRef[A, B]): (A, B)

Перебирает все пары (key, value) в таблице t в порядке вставки.

См. также:

  • итератор mpairs
  • итератор keys
  • итератор values

Примеры:

let a = {
  'o': [1, 5, 7, 9],
  'e': [2, 4, 6, 8]
  }.newOrderedTable

for k, v in a.pairs:
  echo "key: ", k
  echo "value: ", v

# key: o
# value: [1, 5, 7, 9]
# key: e
# value: [2, 4, 6, 8]
Исходный код Изменить
iterator mpairs[A, B](t: OrderedTableRef[A, B]): (A, var B)

Перебирает все пары (key, value) в таблице t в порядке вставки. Значения можно изменить.

См. также:

  • итератор пар
  • итератор значений

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newOrderedTable
for k, v in a.mpairs:
  v.add(v[0] + 10)
doAssert a == {'o': @[1, 5, 7, 9, 11],
               'e': @[2, 4, 6, 8, 12]}.newOrderedTable
Исходный код Изменить
iterator keys[A, B](t: OrderedTableRef[A, B]): A

Перебирает все ключи в таблице t в порядке вставки.

См. также:

  • итератор пар
  • итератор значений

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newOrderedTable
for k in a.keys:
  a[k].add(99)
doAssert a == {'o': @[1, 5, 7, 9, 99], 'e': @[2, 4, 6, 8,
    99]}.newOrderedTable
Исходный код Изменить
iterator values[A, B](t: OrderedTableRef[A, B]): B

Перебирает все значения в таблице t в порядке вставки.

См. также:

  • итератор пар
  • итератор ключей
  • итератор значений

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newOrderedTable
for v in a.values:
  doAssert v.len == 4
Исходный код Изменить
iterator mvalues[A, B](t: OrderedTableRef[A, B]): var B

Перебирает все значения в таблице t в порядке вставки. Значения можно изменить.

См. также:

  • итератор mпар
  • итератор значений

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.newOrderedTable
for v in a.mvalues:
  v.add(99)
doAssert a == {'o': @[1, 5, 7, 9, 99],
               'e': @[2, 4, 6, 8, 99]}.newOrderedTable
Исходный код Изменить
iterator pairs[A](t: CountTable[A]): (A, int)

Перебирает все пары (key, value) в таблице t.

См. также:

  • итератор mпар
  • итератор ключей
  • итератор значений

Примеры:

let a = toCountTable("abracadabra")

for k, v in pairs(a):
  echo "key: ", k
  echo "value: ", v

# key: a
# value: 5
# key: b
# value: 2
# key: c
# value: 1
# key: d
# value: 1
# key: r
# value: 2
Исходный код Изменить
iterator mpairs[A](t: var CountTable[A]): (A, var int)

Перебирает все пары (key, value) в таблице t (должна быть объявлена как var). Значения можно изменить.

См. также:

  • итератор пар
  • итератор значений

Пример:

var a = toCountTable("abracadabra")
for k, v in mpairs(a):
  v = 2
doAssert a == toCountTable("aabbccddrr")
Исходный код Изменить
iterator keys[A](t: CountTable[A]): A

Перебирает все ключи в таблице t.

См. также:

  • итератор пар
  • итератор значений

Пример:

var a = toCountTable("abracadabra")
for k in keys(a):
  a[k] = 2
doAssert a == toCountTable("aabbccddrr")
Исходный код Изменить
iterator values[A](t: CountTable[A]): int

Перебирает все значения в таблице t.

См. также:

  • итератор пар
  • итератор ключей
  • итератор значений

Пример:

let a = toCountTable("abracadabra")
for v in values(a):
  assert v < 10
Исходный код Изменить
iterator mvalues[A](t: var CountTable[A]): var int

Перебирает все значения в таблице t (должна быть объявлена как var). Значения можно изменить.

См. также:

  • итератор mпар
  • итератор значений

Пример:

var a = toCountTable("abracadabra")
for v in mvalues(a):
  v = 2
doAssert a == toCountTable("aabbccddrr")
Исходный код Изменить
iterator pairs[A](t: CountTableRef[A]): (A, int)

Перебирает все пары (key, value) в таблице t.

См. также:

  • итератор mпар
  • итератор ключей
  • итератор значений

Примеры:

let a = newCountTable("abracadabra")

for k, v in pairs(a):
  echo "key: ", k
  echo "value: ", v

# key: a
# value: 5
# key: b
# value: 2
# key: c
# value: 1
# key: d
# value: 1
# key: r
# value: 2
Исходный код Изменить
iterator mpairs[A](t: CountTableRef[A]): (A, var int)

Перебирает все пары (key, value) в таблице t. Значения можно изменить.

См. также:

  • итератор пар
  • итератор значений

Пример:

let a = newCountTable("abracadabra")
for k, v in mpairs(a):
  v = 2
doAssert a == newCountTable("aabbccddrr")
Исходный код Изменить
iterator keys[A](t: CountTableRef[A]): A

Перебирает все ключи в таблице t.

См. также:

  • итератор пар
  • итератор значений

Пример:

let a = newCountTable("abracadabra")
for k in keys(a):
  a[k] = 2
doAssert a == newCountTable("aabbccddrr")
Исходный код Изменить
iterator values[A](t: CountTableRef[A]): int

Перебирает все значения в таблице t.

См. также:

  • итератор пар
  • итератор ключей
  • итератор значений

Пример:

let a = newCountTable("abracadabra")
for v in values(a):
  assert v < 10
Исходный код Изменить
iterator mvalues[A](t: CountTableRef[A]): var int

Перебирает все значения в таблице t. Значения можно изменить.

См. также:

  • итератор mпар
  • итератор значений

Пример:

var a = newCountTable("abracadabra")
for v in mvalues(a):
  v = 2
doAssert a == newCountTable("aabbccddrr")
Исходный код Изменить

Шаблоны

template withValue[A; B](t: var Table[A, B]; key: A; value, body: untyped)

Возвращает значение по t[key].

value можно изменить в области действия вызова withValue.

sharedTable.withValue(key, value) do:
  # block is executed only if ``key`` in ``t``
  value.name = "username"
  value.uid = 1000
Исходный код Изменить
template withValue[A; B](t: var Table[A, B]; key: A;
                         value, body1, body2: untyped)

Возвращает значение по t[key].

value можно изменить в области действия вызова withValue.

table.withValue(key, value) do:
  # block is executed only if ``key`` in ``t``
  value.name = "username"
  value.uid = 1000
do:
  # block is executed when ``key`` not in ``t``
  raise newException(KeyError, "Key not found")
Исходный код Изменить

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/tables.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API