Spec-Zone.ru › Nim

std/tables

ИсточникИзменить

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

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

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

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

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

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

Пример:

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

assert a == b

b[3] = "three"
assert 3 notin a
assert 3 in b
assert a != b
С другой стороны, когда a является TableRef, изменения в b также влияют на a. Обе a и b ссылаются на одну и ту же структуру данных:

Пример:

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

assert a == b

b[3] = "three"

assert 3 in a
assert 3 in b
assert a == b

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

Таблица

Пример:

import std/tables
from std/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

assert beatles == {"George": 1943, "Ringo": 1940, "Paul": 1942, "John": 1940}.toTable


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)

assert beatlesByYear == {1940: @["John", "Ringo"], 1942: @["Paul"], 1943: @["George"]}.toTable

Упорядоченная таблица

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

Пример:

import std/tables
let
  a = [('z', 1), ('y', 2), ('x', 3)]
  ot = a.toOrderedTable  # ordered tables

assert $ot == """{'z': 1, 'y': 2, 'x': 3}"""

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

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

Пример:

import std/tables
let myString = "abracadabra"
let letterFrequencies = toCountTable(myString)
assert $letterFrequencies == "{'a': 5, 'd': 1, 'b': 2, 'r': 2, 'c': 1}"
То же самое можно было бы сделать, вручную проитерировав по контейнеру и увеличив значение каждого ключа с помощью процедуры inc proc:

Пример:

import std/tables
let myString = "abracadabra"
var letterFrequencies = initCountTable[char]()
for c in myString:
  letterFrequencies.inc(c)
assert $letterFrequencies == "{'d': 1, 'r': 2, 'c': 1, 'a': 5, 'b': 2}"

Хэширование

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

Error: type mismatch: got (Person)
but expected one of:
hashes.hash(x: openArray[A]): Hash
hashes.hash(x: int): Hash
hashes.hash(x: float): Hash

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

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

Пример:

import std/tables
import std/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 для структурирования данных, подобного таблице, которое допускает неоднородные члены
  • модуль strtabs для эффективных хэш-таблиц, сопоставляющих строки со строками
  • модуль hashes для вспомогательных функций хэширования

Импорты

since, hashes, math, algorithm, outparams

Типы

CountTable[A] = object

Хэш-таблица, подсчитывающая количество каждого ключа.

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

Источник Изменить
CountTableRef[A] = ref CountTable[A]

Вариант ссылок для CountTable.

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

Источник Изменить
OrderedTable[A; B] = object

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

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

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

Вариант ссылок для OrderedTable.

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

Источник Изменить
Table[A; B] = object

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

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

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

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

Вариант ссылок для Table.

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

Источник Изменить

Константы

defaultInitialSize = 32
Источник Изменить

Процедуры

proc `$`[A, B](t: OrderedTable[A, B]): string
Оператор $ для упорядоченных хэш-таблиц. Используется внутри при вызове echo для таблицы. Исходный код Редактировать
proc `$`[A, B](t: OrderedTableRef[A, B]): string
Оператор $ для хэш-таблиц. Используется внутри при вызове echo для таблицы. Исходный код Редактировать
proc `$`[A, B](t: Table[A, B]): string
Оператор $ для хэш-таблиц. Используется внутри при вызове echo для таблицы. Исходный код Редактировать
proc `$`[A, B](t: TableRef[A, B]): string
Оператор $ для хэш-таблиц. Используется внутри при вызове echo для таблицы. Исходный код Редактировать
proc `$`[A](t: CountTable[A]): string
Оператор $ для таблиц подсчета. Используется внутри при вызове echo для таблицы. Исходный код Редактировать
proc `$`[A](t: CountTableRef[A]): 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 `==`[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 `==`[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 `==`[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 `==`[A](s, t: CountTable[A]): bool
Оператор == для таблиц подсчета. Возвращает true если обе таблицы содержат те же ключи с тем же количеством. Порядок вставки не важен. Исходный код Редактировать
proc `==`[A](s, t: CountTableRef[A]): bool
Оператор == для таблиц подсчета. Возвращает true если обе таблицы nil, или ни одна из них не nil и обе содержат те же ключи с тем же количеством. Порядок вставки не важен. Исходный код Редактировать
proc `[]`[A, B](t: OrderedTable[A, B]; key: A): lent B

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

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

См. также:

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

Пример:

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

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

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

См. также:

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

Пример:

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

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

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

См. также:

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

Пример:

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

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

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

См. также:

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

Пример:

let a = {'a': 5, 'b': 9}.newTable
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 для возвращения значения по умолчанию (например, 0 для целых чисел), если ключ отсутствует
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ отсутствует
  • процедуру []= для добавления новой пары (ключ, значение) в таблицу
  • процедуру hasKey для проверки наличия ключа в таблице
Исходный код Редактировать
proc `[]`[A, B](t: var Table[A, B]; key: A): var B

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

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

См. также:

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

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

См. также:

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

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

См. также:

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

Вставляет пару (ключ, значение) в t.

См. также:

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

Пример:

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

Вставляет пару (ключ, значение) в 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 `[]=`[A, B](t: var OrderedTable[A, B]; key: A; val: sink B)

Вставляет пару (ключ, значение) в 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 `[]=`[A, B](t: var Table[A, B]; key: A; val: sink B)

Вставляет пару (ключ, значение) в t.

См. также:

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

Пример:

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

Вставляет пару (ключ, значение) в t.

См. также:

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

Вставляет пару (ключ, значение) в t.

См. также:

  • [] proc для получения значения по ключу
  • inc proc для увеличения значения по ключу
Исходный код Редактировать
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; вызвало больше путаницы, чем пользы, используйте `[]=`

Добавляет новую пару (ключ, значение) в t, даже если такой ключ уже существует.

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

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

Исходный код Редактировать
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; вызвало больше путаницы, чем пользы, используйте `[]=`

Добавляет новую пару (ключ, значение) в t, даже если такой ключ уже существует.

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

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

Исходный код Редактировать
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; вызвало больше путаницы, чем пользы, используйте `[]=`

Добавляет новую пару (ключ, значение) в t, даже если такой ключ уже существует.

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

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

Исходный код Редактировать
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; вызвало больше путаницы, чем пользы, используйте `[]=`

Добавляет новую пару (ключ, значение) в t, даже если такой ключ уже существует.

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

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

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

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

См. также:

  • del proc

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.newOrderedTable
doAssert len(a) == 3
clear(a)
doAssert len(a) == 0
Исходный код Редактировать
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 clear[A, B](t: var OrderedTable[A, B])

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

См. также:

  • del proc
  • pop proc

Пример:

var a = {'a': 5, 'b': 9, 'c': 13}.toOrderedTable
doAssert len(a) == 3
clear(a)
doAssert len(a) == 0
Исходный код Редактировать
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 clear[A](t: CountTableRef[A])

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

См. также:

  • del proc
  • pop proc
Исходный код Редактировать
proc clear[A](t: var CountTable[A])

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

См. также:

  • del proc
  • pop proc
Исходный код Редактировать
proc contains[A, B](t: OrderedTable[A, B]; key: A): bool
Псевдоним процедуры hasKey proc для использования с оператором in.

Пример:

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

Пример:

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

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert 'b' in a == true
doAssert a.contains('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 contains[A](t: CountTable[A]; key: A): bool
Псевдоним процедуры hasKey proc для использования с оператором in. Исходный код Изменить
proc contains[A](t: CountTableRef[A]; key: A): bool
Псевдоним процедуры hasKey proc для использования с оператором in. Исходный код Изменить
proc del[A, B](t: OrderedTableRef[A, B]; key: A)

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

См. также:

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

Пример:

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 del[A, B](t: TableRef[A, B]; key: A)
Удаляет key из хеш-таблицы t. Ничего не делает, если ключ не существует.
Предупреждение: Если были добавлены дублирующие ключи (через устаревшую процедуру add), может потребоваться вызвать эту процедуру несколько раз.

См. также:

  • 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 del[A, B](t: var OrderedTable[A, B]; key: A)

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

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

См. также:

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

Пример:

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 del[A, B](t: var Table[A, B]; key: A)
Удаляет key из хеш-таблицы t. Ничего не делает, если ключ не существует.
Предупреждение: Если были добавлены дублирующие ключи (через устаревшую процедуру add), может потребоваться вызвать эту процедуру несколько раз.

См. также:

  • 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 del[A](t: CountTableRef[A]; key: A)

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

См. также:

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

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

См. также:

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

Пример:

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 getOrDefault[A, B](t: OrderedTable[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}.toOrderedTable
doAssert a.getOrDefault('a') == 5
doAssert a.getOrDefault('z') == 0
Source Edit
proc getOrDefault[A, B](t: OrderedTable[A, B]; key: A; default: B): B

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

См. также:

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

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Source Edit
proc getOrDefault[A, B](t: OrderedTableRef[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}.newOrderedTable
doAssert a.getOrDefault('a') == 5
doAssert a.getOrDefault('z') == 0
Source Edit
proc getOrDefault[A, B](t: OrderedTableRef[A, B]; key: A; default: B): B

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

См. также:

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

Пример:

let a = {'a': 5, 'b': 9}.newOrderedTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Source Edit
proc getOrDefault[A, B](t: Table[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}.toTable
doAssert a.getOrDefault('a') == 5
doAssert a.getOrDefault('z') == 0
Source Edit
proc getOrDefault[A, B](t: Table[A, B]; key: A; default: B): B

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

См. также:

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

Пример:

let a = {'a': 5, 'b': 9}.toTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Source Edit
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
Source Edit
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 для возврата значения по умолчанию (например, ноль для int), если ключ не существует

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert a.getOrDefault('a', 99) == 5
doAssert a.getOrDefault('z', 99) == 99
Source Edit
proc getOrDefault[A](t: CountTable[A]; key: A; default: int = 0): int

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

См. также:

  • [] proc для извлечения значения ключа
  • hasKey proc для проверки наличия ключа в таблице
Source Edit
proc getOrDefault[A](t: CountTableRef[A]; key: A; default: int): int

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

См. также:

  • [] proc для извлечения значения ключа
  • hasKey proc для проверки наличия ключа в таблице
Source Edit
proc hash[K, V](s: OrderedTable[K, V]): Hash
Source Edit
proc hash[K, V](s: Table[K, V]): Hash
Source Edit
proc hash[V](s: CountTable[V]): Hash
Source Edit
proc hasKey[A, B](t: OrderedTable[A, B]; key: A): bool

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

См. также:

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

Пример:

let a = {'a': 5, 'b': 9}.toOrderedTable
doAssert a.hasKey('a') == true
doAssert a.hasKey('z') == false
Исходный код Изменить
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 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 hasKey[A, B](t: TableRef[A, B]; key: A): bool

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

См. также:

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

Пример:

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

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

См. также:

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

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

См. также:

  • процедуру contains для использования с оператором in
  • процедуру [] для получения значения ключа
  • процедуру getOrDefault для возвращения пользовательского значения, если ключ не существует
Исходный код Изменить
proc hasKeyOrPut[A, B](t: 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 hasKeyOrPut[A, B](t: TableRef[A, B]; key: A; val: B): bool

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

См. также:

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

Пример:

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 hasKeyOrPut[A, B](t: var OrderedTable[A, B]; key: A; val: B): bool

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

См. также:

  • процедуру hasKey
  • процедуру [] для получения значения ключа
  • процедуру getOrDefault для возвращения значения по умолчанию (например, нуля для целых чисел), если ключ не существует
  • процедуру 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 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 inc[A](t: CountTableRef[A]; key: A; val = 1)
Исходный код Изменить
proc inc[A](t: var CountTable[A]; key: A; val = 1)
Исходный код Изменить
proc indexBy[A, B, C](collection: A; index: proc (x: B): C): Table[C, B]
Индексировать коллекцию с помощью предоставленной процедуры. Исходный код Изменить
proc initCountTable[A](initialSize = defaultInitialSize): CountTable[A]

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

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

См. также:

  • процедуру toCountTable
  • процедуру newCountTable для создания CountTableRef
Исходный код Изменить
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 initTable[A, B](initialSize = defaultInitialSize): Table[A, B]

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

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

См. также:

  • toTable proc
  • newTable proc для создания TableRef

Пример:

let
  a = initTable[int, string]()
  b = initTable[char, seq[int]]()
Исходный код Редактировать
proc largest[A](t: CountTable[A]): tuple[key: A, val: int]

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

См. также:

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

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

См. также:

  • smallest proc
Исходный код Редактировать
proc len[A, B](t: OrderedTable[A, B]): int {.inline.}
Возвращает количество ключей в t.

Пример:

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

Пример:

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

Пример:

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

Пример:

let a = {'a': 5, 'b': 9}.newTable
doAssert len(a) == 2
Исходный код Редактировать
proc len[A](t: CountTable[A]): int
Возвращает количество ключей в t. Исходный код Редактировать
proc len[A](t: CountTableRef[A]): int
Возвращает количество ключей в t. Исходный код Редактировать
proc merge[A](s, t: CountTableRef[A])
Объединяет вторую таблицу в первую.

Пример:

let
  a = newCountTable("aaabbc")
  b = newCountTable("bcc")
a.merge(b)
doAssert a == newCountTable("aaabbbccc")
Исходный код Редактировать
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 mgetOrPut[A, B](t: OrderedTableRef[A, B]; key: A): var B
Извлекает значение по ключу t[key] или помещает значение по умолчанию для типа B (например, 0 для целочисленных типов).

Пример:

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

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

См. также:

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

Пример:

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 mgetOrPut[A, B](t: TableRef[A, B]; key: A): var B
Извлекает значение по ключу t[key] или помещает значение по умолчанию для типа B (например, 0 для целочисленных типов).

Пример:

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

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

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

См. также:

  • [] 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 mgetOrPut[A, B](t: var OrderedTable[A, B]; key: A): var B
Извлекает значение по ключу t[key] или помещает значение по умолчанию для типа B (например, 0 для целочисленных типов).

Пример:

var a = {'a': 5}.toOrderedTable
doAssert a.mgetOrPut('a') == 5
a.mgetOrPut('z').inc
doAssert a == {'a': 5, 'z': 1}.toOrderedTable
Исходный код Редактировать
proc mgetOrPut[A, B](t: var OrderedTable[A, B]; key: A; val: B): var B

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

См. также:

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

Пример:

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 mgetOrPut[A, B](t: var Table[A, B]; key: A): var B
Извлекает значение по ключу t[key] или помещает значение по умолчанию для типа B (например, 0 для целочисленных типов).

Пример:

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

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

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

См. также:

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

Пример:

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 newCountTable[A](initialSize = defaultInitialSize): CountTableRef[A]

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

См. также:

  • newCountTable proc для создания таблицы с подсчётом из коллекции
  • initCountTable proc для создания пустой таблицы с подсчётом
Исходный код Редактировать
proc newCountTable[A](keys: openArray[A]): CountTableRef[A]
Создаёт новую таблицу с подсчётом, где каждый элемент из контейнера keys имеет счётчик, указывающий на количество его вхождений в контейнере. Исходный код Редактировать
proc newOrderedTable[A, B](initialSize = defaultInitialSize): OrderedTableRef[A,
    B]

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

См. также:

  • newOrderedTable proc для создания упорядоченной таблицы из коллекции пар (key, value)
  • initOrderedTable proc для создания пустой упорядоченной таблицы

Пример:

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 proc
  • toOrderedTable proc для версии перевода

Пример:

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

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

См. также:

  • newTable proc для создания таблицы из коллекции пар (key, value)
  • initTable proc для создания пустой таблицы

Пример:

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 для версии перевода

Пример:

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 pop[A, B](t: OrderedTableRef[A, B]; key: A; val: var B): bool

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

См. также:

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

Пример:

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 pop[A, B](t: TableRef[A, B]; key: A; val: var B): bool
Удаляет элемент key из таблицы. Возвращает true, если элемент key существовал, и устанавливает val в отображение ключа. В противном случае возвращает false, и val остается неизменным.
Предупреждение: Если были добавлены дублирующие ключи (через теперь устаревшую процедуру add ), может потребоваться вызвать эту функцию несколько раз.

См. также:

  • 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 pop[A, B](t: var OrderedTable[A, B]; key: A; val: var B): bool

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

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

См. также:

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

Пример:

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 pop[A, B](t: var Table[A, B]; key: A; val: var B): bool
Удаляет элемент key из таблицы. Возвращает true, если элемент key существовал, и устанавливает val в отображение ключа. В противном случае возвращает false, и val остается неизменным.
Предупреждение: Если были добавлены дублирующие ключи (через теперь устаревшую процедуру add ), может потребоваться вызвать эту функцию несколько раз.

См. также:

  • 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 pop[A](t: CountTableRef[A]; key: A; val: var int): bool

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

См. также:

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

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

См. также:

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

Пример:

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 smallest[A](t: CountTable[A]): tuple[key: A, val: int]

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

См. также:

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

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

См. также:

  • largest proc
Исходный код Редактировать
proc sort[A, B](t: OrderedTableRef[A, B]; cmp: proc (x, y: (A, B)): int;
                order = SortOrder.Ascending) {.effectsOf: cmp.}

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

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

Пример:

import std/[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 sort[A, B](t: var OrderedTable[A, B]; cmp: proc (x, y: (A, B)): int;
                order = SortOrder.Ascending) {.effectsOf: cmp.}

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

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

Пример:

import std/[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 sort[A](t: CountTableRef[A]; order = SortOrder.Descending)

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

Это деструктивная операция! Не изменяйте `t` после этого!

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

Исходный код Редактировать
proc sort[A](t: var CountTable[A]; order = SortOrder.Descending)
Сортирует таблицу подсчёта, так что по умолчанию запись с наибольшим счётчиком стоит первой.
Предупреждение: Это деструктивная операция! После сортировки не изменяйте t!

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

Пример:

import std/[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 take[A, B](t: TableRef[A, B]; key: A; val: var B): bool {.inline.}
Псевдоним для:
  • pop proc
Исходный код Редактировать
proc take[A, B](t: var Table[A, B]; key: A; val: var B): bool {.inline.}
Псевдоним для:
  • pop proc
Исходный код Редактировать
proc toCountTable[A](keys: openArray[A]): CountTable[A]
Создаёт новую таблицу подсчёта, где каждый член контейнера keys имеет счётчик, указывающий, сколько раз он встречается в этом контейнере. Источник Редактировать
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 toTable[A, B](pairs: openArray[(A, B)]): Table[A, B]

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

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

См. также:

  • initTable proc
  • newTable proc для версии TableRef

Пример:

let a = [('a', 5), ('b', 9)]
let b = toTable(a)
assert b == {'a': 5, 'b': 9}.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 std/[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 keys[A, B](t: OrderedTable[A, B]): lent A

Итерирует по любому ключу в таблице t в порядке добавления.

См. также:

  • pairs iterator
  • values iterator

Пример:

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 keys[A, B](t: OrderedTableRef[A, B]): lent A

Итерирует по любому ключу в таблице t в порядке добавления.

См. также:

  • pairs iterator
  • values iterator

Пример:

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 keys[A, B](t: Table[A, B]): lent A

Итерирует по любому ключу в таблице t.

См. также:

  • pairs iterator
  • values iterator

Пример:

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 keys[A, B](t: TableRef[A, B]): lent A

Итерирует по любому ключу в таблице t.

См. также:

  • pairs iterator
  • values iterator

Пример:

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 keys[A](t: CountTable[A]): lent A

Итерирует по любому ключу в таблице t.

См. также:

  • pairs iterator
  • values iterator

Пример:

var a = toCountTable("abracadabra")
for k in keys(a):
  a[k] = 2
doAssert a == toCountTable("aabbccddrr")
Источник Редактировать
iterator keys[A](t: CountTableRef[A]): A

Итерирует по любому ключу в таблице t.

См. также:

  • pairs iterator
  • values iterator

Пример:

let a = newCountTable("abracadabra")
for k in keys(a):
  a[k] = 2
doAssert a == newCountTable("aabbccddrr")
Источник Редактировать
iterator mpairs[A, B](t: OrderedTableRef[A, B]): (A, var B)

Итерирует по любой паре (key, value) в таблице t в порядке добавления. Значения могут быть изменены.

См. также:

  • pairs iterator
  • mvalues iterator

Пример:

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 mpairs[A, B](t: TableRef[A, B]): (A, var B)

Итерирует по любой паре (key, value) в таблице t. Значения могут быть изменены.

См. также:

  • pairs iterator
  • mvalues iterator

Пример:

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 mpairs[A, B](t: var OrderedTable[A, B]): (A, var B)

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

См. также:

  • pairs iterator
  • mvalues iterator

Пример:

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 mpairs[A, B](t: var Table[A, B]): (A, var B)

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

См. также:

  • pairs iterator
  • mvalues iterator

Пример:

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 mpairs[A](t: CountTableRef[A]): (A, var int)

Итерирует по любой паре (key, value) в таблице t. Значения могут быть изменены.

См. также:

  • pairs iterator
  • mvalues iterator

Пример:

let a = newCountTable("abracadabra")
for k, v in mpairs(a):
  v = 2
doAssert a == newCountTable("aabbccddrr")
Источник Редактировать
iterator mpairs[A](t: var CountTable[A]): (A, var int)

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

См. также:

  • pairs iterator
  • mvalues iterator

Пример:

var a = toCountTable("abracadabra")
for k, v in mpairs(a):
  v = 2
doAssert a == toCountTable("aabbccddrr")
Источник Редактировать
iterator mvalues[A, B](t: OrderedTableRef[A, B]): var B

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

См. также:

  • Итератор mpairs
  • Итератор значений

Пример:

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 mvalues[A, B](t: TableRef[A, B]): var B

Итерирует по любому значению в таблице t. Значения можно изменять.

См. также:

  • Итератор mpairs
  • Итератор значений

Пример:

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 mvalues[A, B](t: var OrderedTable[A, B]): var B

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

См. также:

  • Итератор mpairs
  • Итератор значений

Пример:

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 mvalues[A, B](t: var Table[A, B]): var B

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

См. также:

  • Итератор mpairs
  • Итератор значений

Пример:

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 mvalues[A](t: CountTableRef[A]): var int

Итерирует по любому значению в таблице t. Значения можно изменять.

См. также:

  • Итератор mpairs
  • Итератор значений

Пример:

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

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

См. также:

  • Итератор mpairs
  • Итератор значений

Пример:

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

Итерирует по любой (key, value) паре в таблице t в порядке вставки.

См. также:

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

Примеры:

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 pairs[A, B](t: OrderedTableRef[A, B]): (A, B)

Итерирует по любой (key, value) паре в таблице t в порядке вставки.

См. также:

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

Примеры:

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 pairs[A, B](t: Table[A, B]): (A, B)

Итерирует по любой (key, value) паре в таблице t.

См. также:

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

Примеры:

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 pairs[A, B](t: TableRef[A, B]): (A, B)

Итерирует по любой (key, value) паре в таблице t.

См. также:

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

Примеры:

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 pairs[A](t: CountTable[A]): (A, int)

Итерирует по любой (key, value) паре в таблице t.

См. также:

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

Примеры:

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 pairs[A](t: CountTableRef[A]): (A, int)

Итерирует по любой (key, value) паре в таблице t.

См. также:

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

Примеры:

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 values[A, B](t: OrderedTable[A, B]): lent B

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

См. также:

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

Пример:

let a = {
  'o': @[1, 5, 7, 9],
  'e': @[2, 4, 6, 8]
  }.toOrderedTable
for v in a.values:
  doAssert v.len == 4
Исходный код Изменить
iterator values[A, B](t: OrderedTableRef[A, B]): lent 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 values[A, B](t: Table[A, B]): lent B

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

См. также:

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

Пример:

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

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

См. также:

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

Пример:

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

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

См. также:

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

Пример:

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

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

См. также:

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

Пример:

let a = newCountTable("abracadabra")
for v in values(a):
  assert v < 10
Исходный код Изменить

Шаблоны

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

Получает значение по t[key].

value может быть изменено в рамках вызова withValue.

Пример:

type
  User = object
    name: string
    uid: int

var t = initTable[int, User]()
let u = User(name: "Hello", uid: 99)
t[1] = u

t.withValue(1, value):
  # block is executed only if `key` in `t`
  value.name = "Nim"
  value.uid = 1314

t.withValue(521, value):
  doAssert false
do:
  # block is executed when `key` not in `t`
  t[1314] = User(name: "exist", uid: 521)

assert t[1].name == "Nim"
assert t[1].uid == 1314
assert t[1314].name == "exist"
assert t[1314].uid == 521
Исходный код Изменить
template withValue[A, B](t: var Table[A, B]; key: A; value, body: untyped)

Получает значение по t[key].

value может быть изменено в рамках вызова withValue.

Пример:

type
  User = object
    name: string
    uid: int

var t = initTable[int, User]()
let u = User(name: "Hello", uid: 99)
t[1] = u

t.withValue(1, value):
  # block is executed only if `key` in `t`
  value.name = "Nim"
  value.uid = 1314

t.withValue(2, value):
  value.name = "No"
  value.uid = 521

assert t[1].name == "Nim"
assert t[1].uid == 1314
Исходный код Изменить

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

Spec-Zone.ru

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