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.
Источник Изменить
Константы
Процедуры
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 `[]=`[A](t: var CountTable[A]; key: A; val: int)
-
Вставляет пару (ключ, значение) в
t.См. также:
Исходный код Редактировать 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 `[]=`".}-
Добавляет новую пару (ключ, значение) в
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 `[]=`".}-
Добавляет новую пару (ключ, значение) в
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 `[]=`".}-
Добавляет новую пару (ключ, значение) в
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 `[]=`".}-
Добавляет новую пару (ключ, значение) в
t, даже если такой ключ уже существует.Это может привести к дублированию ключей в таблице!
Используйте []= proc для вставки новой пары (ключ, значение) в таблицу без дублирования ключей.
Исходный код Редактировать 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 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 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 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 clear[A](t: CountTableRef[A])
-
Сбрасывает таблицу в пустое состояние.
См. также:
Исходный код Редактировать proc clear[A](t: var CountTable[A])
-
Сбрасывает таблицу в пустое состояние.
См. также:
Исходный код Редактировать
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') == 0Source 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) == 99Source 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') == 0Source 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) == 99Source 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') == 0Source 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) == 99Source 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') == 0Source 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) == 99Source Edit proc getOrDefault[A](t: CountTable[A]; key: A; default: int = 0): int
-
Извлекает значение по
t[key]еслиkeyнаходится вt. В противном случае возвращается целочисленное значениеdefault.См. также:
- [] proc для извлечения значения ключа
- hasKey proc для проверки наличия ключа в таблице
proc getOrDefault[A](t: CountTableRef[A]; key: A; default: int): int
-
Извлекает значение по
t[key]еслиkeyнаходится вt. В противном случае возвращается целочисленное значениеdefault.См. также:
- [] proc для извлечения значения ключа
- hasKey proc для проверки наличия ключа в таблице
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Исходный код Изменить -
процедуру contains для использования с оператором
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 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 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Исходный код Изменить -
процедуру contains для использования с оператором
proc hasKey[A](t: CountTable[A]; key: A): bool
-
Возвращает true, если
keyприсутствует в таблицеt.См. также:
-
процедуру contains для использования с оператором
in - процедуру [] для получения значения ключа
- процедуру getOrDefault для возвращения пользовательского значения, если ключ не существует
-
процедуру contains для использования с оператором
proc hasKey[A](t: CountTableRef[A]; key: A): bool
-
Возвращает true, если
keyприсутствует в таблицеt.См. также:
-
процедуру contains для использования с оператором
in - процедуру [] для получения значения ключа
- процедуру getOrDefault для возвращения пользовательского значения, если ключ не существует
-
процедуру contains для использования с оператором
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)См. также:
Исходный код Редактировать proc largest[A](t: CountTableRef[A]): tuple[key: A, val: int]
-
Возвращает
(key, value)пару с наибольшимval. Эффективность: O(n)См. также:
Исходный код Редактировать 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]]()
Исходный код Редактировать -
newOrderedTable proc для создания упорядоченной таблицы из коллекции пар
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]]()
Исходный код Редактировать -
newTable proc для создания таблицы из коллекции пар
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)См. также:
Исходный код Редактировать proc smallest[A](t: CountTableRef[A]): tuple[key: A, val: int]
-
Возвращает пару с наименьшим
val. Эффективность: O(n)См. также:
Исходный код Редактировать 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.}- Псевдоним для: Исходный код Редактировать
proc take[A, B](t: var Table[A, B]; key: A; val: var B): bool {.inline.}- Псевдоним для: Исходный код Редактировать
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".}-
Итерирует по любому значению в таблице
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в порядке добавления.См. также:
Пример:
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в порядке добавления.См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
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.См. также:
Пример:
var a = toCountTable("abracadabra") for k in keys(a): a[k] = 2 doAssert a == toCountTable("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 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 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 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 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 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 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 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 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 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 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 mvalues[A](t: CountTableRef[A]): var int
-
Итерирует по любому значению в таблице
t. Значения можно изменять.См. также:
Пример:
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). Значения можно изменять.См. также:
Пример:
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в порядке вставки.См. также:
Примеры:
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в порядке вставки.См. также:
Примеры:
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.См. также:
Примеры:
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.См. также:
Примеры:
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.См. также:
Примеры:
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.См. также:
Примеры:
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