таблицы
Модуль 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: [].}-
Устаревшее начиная с 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Исходный код Изменить -
процедуру contains для использования с оператором
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 `[]=`".}
-
Добавляет новую пару
(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.}- Псевдоним для: Исходный код Изменить
proc clear[A, B](t: var Table[A, B])
-
Сбрасывает таблицу, делая ее пустой.
См. также:
Пример:
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]]()
Исходный код Изменить -
newTable proc для создания
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Исходный код Изменить -
contains proc для использования с оператором
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 `[]=`".}-
Вставляет новую пару
(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.}- Псевдоним для: Исходный код Редактировать
proc clear[A, B](t: TableRef[A, B])
-
Сбрасывает таблицу в пустое состояние.
См. также:
Пример:
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Исходный код Изменить -
процедура contains для использования с оператором
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 `[]=`".}-
Добавляет новую пару
(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])
-
Сбрасывает таблицу, делая её пустой.
См. также:
Пример:
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]]()
Исходный код Изменить -
процедура newOrderedTable для создания
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Исходный код Редактировать -
процедура contains для использования с оператором
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 `[]=`".}-
Вставляет новую пару
(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])
-
Сбрасывает таблицу, делая её пустой.
См. также:
Пример:
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[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)См. также:
Исходный код Редактировать proc largest[A](t: CountTable[A]): tuple[key: A, val: int]
-
Возвращает пару
(key, value)с наибольшимval. Эффективность: O(n)См. также:
Исходный код Редактировать proc hasKey[A](t: CountTable[A]; key: A): bool
-
Возвращает true, если
keyсодержится в таблицеt.См. также:
-
процедура contains для использования с оператором
in - [] proc для получения значения по ключу
- процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует
-
процедура contains для использования с оператором
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])
-
Обнуляет таблицу, делая её пустой.
См. также:
Исходный код Редактировать 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)См. также:
Исходный код Изменить proc largest[A](t: CountTableRef[A]): tuple[key: A, val: int]
-
Возвращает пару
(key, value)с наибольшимval. Эффективность: O(n)См. также:
Исходный код Изменить proc hasKey[A](t: CountTableRef[A]; key: A): bool
-
Возвращает true, если
keyнаходится в таблицеt.См. также:
-
процедура contains для использования с оператором
in - процедура [] для получения значения по ключу
- процедура getOrDefault для возвращения пользовательского значения, если ключ отсутствует
-
процедура contains для использования с оператором
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])
-
Сбрасывает таблицу в пустое состояние.
См. также:
Исходный код Изменить 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.См. также:
Примеры:
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). Значения можно изменять.См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
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). Значения можно изменять.См. также:
Пример:
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".}-
Перебирает все значения в таблице
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.См. также:
Примеры:
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. Значения можно изменять.См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
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. Значения можно изменять.См. также:
Пример:
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в порядке вставки.См. также:
Примеры:
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) в порядке вставки. Значения можно изменять.См. также:
Пример:
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в порядке вставки.См. также:
Пример:
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в порядке вставки.См. также:
Пример:
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) в порядке вставки. Значения можно изменять.См. также:
Пример:
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в порядке вставки.См. также:
Примеры:
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в порядке вставки. Значения можно изменить.См. также:
Пример:
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.См. также:
Примеры:
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). Значения можно изменить.См. также:
Пример:
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.См. также:
Примеры:
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. Значения можно изменить.См. также:
Пример:
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