std/deques
SourceEditРеализация очереди с двумя концами (double-ended queue). Основная реализация использует seq.
Если скомпилировано с опцией boundChecks, эти процедуры будут вызывать исключение IndexDefect при таком доступе. На это не следует полагаться, так как -d:danger или --checks:off отключит эти проверки, и тогда процедуры могут вернуть мусор или привести к сбою программы.
Поэтому перед любым доступом необходима проверка, пуста ли очередь, если ваша логика программы не гарантирует это косвенно.
Пример:
import std/deques var a = [10, 20, 30, 40].toDeque doAssertRaises(IndexDefect, echo a[4]) a.addLast(50) assert $a == "[10, 20, 30, 40, 50]" assert a.peekFirst == 10 assert a.peekLast == 50 assert len(a) == 5 assert a.popFirst == 10 assert a.popLast == 50 assert len(a) == 3 a.addFirst(11) a.addFirst(22) a.addFirst(33) assert $a == "[33, 22, 11, 20, 30, 40]" a.shrink(fromFirst = 1, fromLast = 2) assert $a == "[22, 11, 20]"
См. также
- модуль lists для односвязных и двусвязных списков и колец
Импорты
- since, assertions, hashes, math
Типы
Константы
Процедуры
proc `$`[T](deq: Deque[T]): string
- Преобразует очередь в её строковое представление.
Пример:
let a = [10, 20, 30].toDeque assert $a == "[10, 20, 30]"
Исходный код Редактировать func `==`[T](deq1, deq2: Deque[T]): bool
- Оператор сравнения для очереди. Возвращает
==если обе очереди содержат одинаковые значения в том же порядке.Пример:
var a, b = initDeque[int]() a.addFirst(2) a.addFirst(1) b.addLast(1) b.addLast(2) doAssert a == b
Исходный код Редактировать proc `[]`[T](deq: Deque[T]; i: BackwardsIndex): lent T {.inline.}-
Доступ к элементу с обратным индексом
i.deq[^1]- это последний элемент.Пример:
let a = [10, 20, 30, 40, 50].toDeque assert a[^1] == 50 assert a[^4] == 20 doAssertRaises(IndexDefect, echo a[^9])
Исходный код Редактировать proc `[]`[T](deq: Deque[T]; i: Natural): lent T {.inline.}- Доступ к
i-му элементуdeq.Пример:
let a = [10, 20, 30, 40, 50].toDeque assert a[0] == 10 assert a[3] == 40 doAssertRaises(IndexDefect, echo a[8])
Исходный код Редактировать proc `[]`[T](deq: var Deque[T]; i: BackwardsIndex): var T {.inline.}-
Доступ к элементу с обратным индексом
iи получение изменяемой ссылки на него.deq[^1]- это последний элемент.Пример:
var a = [10, 20, 30, 40, 50].toDeque inc(a[^1]) assert a[^1] == 51
Исходный код Редактировать proc `[]`[T](deq: var Deque[T]; i: Natural): var T {.inline.}- Доступ к
i-му элементуdeqи получение изменяемой ссылки на него.Пример:
var a = [10, 20, 30, 40, 50].toDeque inc(a[0]) assert a[0] == 11
Исходный код Редактировать proc `[]=`[T](deq: var Deque[T]; i: BackwardsIndex; x: sink T) {.inline.}-
Устанавливает значение обратного индекса
iэлементаdeqнаx.deq[^1]- это последний элемент.Пример:
var a = [10, 20, 30, 40, 50].toDeque a[^1] = 99 a[^3] = 77 assert $a == "[10, 20, 77, 40, 99]"
Исходный код Редактировать proc `[]=`[T](deq: var Deque[T]; i: Natural; val: sink T) {.inline.}- Устанавливает
i-й элементdeqнаval.Пример:
var a = [10, 20, 30, 40, 50].toDeque a[0] = 99 a[3] = 66 assert $a == "[99, 20, 30, 66, 50]"
Исходный код Редактировать proc addFirst[T](deq: var Deque[T]; item: sink T)
-
Добавляет
itemв началоdeq.См. также:
Пример:
var a = initDeque[int]() for i in 1 .. 5: a.addFirst(10 * i) assert $a == "[50, 40, 30, 20, 10]"
Исходный код Редактировать proc addLast[T](deq: var Deque[T]; item: sink T)
-
Добавляет
itemв конецdeq.См. также:
Пример:
var a = initDeque[int]() for i in 1 .. 5: a.addLast(10 * i) assert $a == "[10, 20, 30, 40, 50]"
Исходный код Редактировать proc clear[T](deq: var Deque[T]) {.inline.}-
Очищает очередь, делая её пустой.
См. также:
Пример:
var a = [10, 20, 30, 40, 50].toDeque assert $a == "[10, 20, 30, 40, 50]" clear(a) assert len(a) == 0
Исходный код Редактировать proc contains[T](deq: Deque[T]; item: T): bool {.inline.}-
Возвращает true, если
itemсодержится вdeq, или false, если не найдено.Обычно используется с оператором
in. Эквивалентноdeq.find(item) >= 0.Пример:
let q = [7, 9].toDeque assert 7 in q assert q.contains(7) assert 8 notin q
Исходный код Редактировать func hash[T](deq: Deque[T]): Hash
- Хеширование очереди. Исходный код Редактировать
proc initDeque[T](initialSize: int = defaultInitialSize): Deque[T]
-
Создаёт новую пустую очередь.
Необязательно, начальный размер может быть зарезервирован с помощью
initialSizeв качестве оптимизации производительности (по умолчанию: defaultInitialSize). Длина созданной очереди будет всё равно 0.См. также:
Исходный код Редактировать func len[T](deq: Deque[T]): int {.inline.}- Возвращает количество элементов в
deq. Исходный код Редактировать proc peekFirst[T](deq: Deque[T]): lent T {.inline.}-
Возвращает первый элемент
deq, но не удаляет его из очереди.См. также:
- peekFirst proc, которая возвращает изменяемую ссылку
- peekLast proc
Пример:
let a = [10, 20, 30, 40, 50].toDeque assert $a == "[10, 20, 30, 40, 50]" assert a.peekFirst == 10 assert len(a) == 5
Исходный код Редактировать proc peekFirst[T](deq: var Deque[T]): var T {.inline.}-
Возвращает изменяемую ссылку на первый элемент
deq, но не удаляет его из очереди.См. также:
Пример:
var a = [10, 20, 30, 40, 50].toDeque a.peekFirst() = 99 assert $a == "[99, 20, 30, 40, 50]"
Исходный код Редактировать proc peekLast[T](deq: Deque[T]): lent T {.inline.}-
Возвращает последний элемент
deq, но не удаляет его из очереди.См. также:
- peekLast proc которая возвращает изменяемую ссылку
- peekFirst proc
Пример:
let a = [10, 20, 30, 40, 50].toDeque assert $a == "[10, 20, 30, 40, 50]" assert a.peekLast == 50 assert len(a) == 5
Исходный код Редактировать proc peekLast[T](deq: var Deque[T]): var T {.inline.}-
Возвращает изменяемую ссылку на последний элемент
deq, но не удаляет его из очереди.См. также:
Пример:
var a = [10, 20, 30, 40, 50].toDeque a.peekLast() = 99 assert $a == "[10, 20, 30, 40, 99]"
Исходный код Редактировать
proc popFirst[T](deq: var Deque[T]): T {.inline, discardable.}-
Удаляет и возвращает первый элемент
deq.См. также:
Пример:
var a = [10, 20, 30, 40, 50].toDeque assert $a == "[10, 20, 30, 40, 50]" assert a.popFirst == 10 assert $a == "[20, 30, 40, 50]"
Исходный код Изменить proc popLast[T](deq: var Deque[T]): T {.inline, discardable.}-
Удаляет и возвращает последний элемент
deq.См. также:
Пример:
var a = [10, 20, 30, 40, 50].toDeque assert $a == "[10, 20, 30, 40, 50]" assert a.popLast == 50 assert $a == "[10, 20, 30, 40]"
Исходный код Изменить proc shrink[T](deq: var Deque[T]; fromFirst = 0; fromLast = 0)
-
Удаляет
fromFirstэлементов с начала очереди иfromLastэлементов с конца.Если указанное количество элементов превышает общее количество элементов в очереди, очередь останется пустой.
См. также:
Пример:
var a = [10, 20, 30, 40, 50].toDeque assert $a == "[10, 20, 30, 40, 50]" a.shrink(fromFirst = 2, fromLast = 1) assert $a == "[30, 40]"
Исходный код Изменить proc toDeque[T](x: openArray[T]): Deque[T]
-
Создаёт новую очередь, содержащую элементы
x(в том же порядке).См. также:
Пример:
let a = toDeque([7, 8, 9]) assert len(a) == 3 assert $a == "[7, 8, 9]"
Исходный код Изменить
Итераторы
iterator items[T](deq: Deque[T]): lent T
-
Возвращает каждый элемент
deq.См. также:
Пример:
from std/sequtils import toSeq let a = [10, 20, 30, 40, 50].toDeque assert toSeq(a.items) == @[10, 20, 30, 40, 50]
Исходный код Изменить iterator mitems[T](deq: var Deque[T]): var T
-
Возвращает каждый элемент
deq, который можно изменить.См. также:
Пример:
var a = [10, 20, 30, 40, 50].toDeque assert $a == "[10, 20, 30, 40, 50]" for x in mitems(a): x = 5 * x - 1 assert $a == "[49, 99, 149, 199, 249]"
Исходный код Изменить iterator pairs[T](deq: Deque[T]): tuple[key: int, val: T]
- Возвращает каждую
(position, value)-паруdeq.Пример:
from std/sequtils import toSeq let a = [10, 20, 30].toDeque assert toSeq(a.pairs) == @[(0, 10), (1, 20), (2, 30)]
Исходный код Изменить
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/deques.html