On this page
deques
Implementation of a deque (double-ended queue). The underlying implementation uses a seq
.
None of the procs that get an individual value from the deque can be used on an empty deque. If compiled with boundChecks
option, those procs will raise an IndexDefect
on such access. This should not be relied upon, as -d:danger
or --checks:off
will disable those checks and may return garbage or crash the program.
As such, a check to see if the deque is empty is needed before any access, unless your program logic guarantees it indirectly.
import deques
var a = initDeque[int]()
doAssertRaises(IndexDefect, echo a[0])
for i in 1 .. 5:
a.addLast(10*i)
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]"
See also:
- lists module for singly and doubly linked lists and rings
- channels module for inter-thread communication
Imports
Types
-
Deque[T] = object data: seq[T] head, tail, count, mask: int
-
A double-ended queue backed with a ringed seq buffer.
To initialize an empty deque use initDeque proc.
Source Edit
Consts
Procs
-
proc initDeque[T](initialSize: int = 4): Deque[T]
-
Creates a new empty deque.
Optionally, the initial capacity can be reserved via
initialSize
as a performance optimization. The length of a newly created deque will still be 0.See also:
Source Edit -
proc toDeque[T](x: openArray[T]): Deque[T]
-
Creates a new deque that contains the elements of
x
(in the same order).See also:
Example:
Source Editvar a = toDeque([7, 8, 9]) assert len(a) == 3 assert a.popFirst == 7 assert len(a) == 2
-
proc len[T](deq: Deque[T]): int {...}{.inline.}
-
Returns the number of elements of
deq
. Source Edit -
proc `[]`[T](deq: Deque[T]; i: Natural): T {...}{.inline.}
-
Accesses the i-th element of
deq
.Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert a[0] == 10 assert a[3] == 40 doAssertRaises(IndexDefect, echo a[8])
-
proc `[]`[T](deq: var Deque[T]; i: Natural): var T {...}{.inline.}
-
Accesses the i-th element of
deq
and return a mutable reference to it.Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert a[0] == 10 assert a[3] == 40 doAssertRaises(IndexDefect, echo a[8])
-
proc `[]=`[T](deq: var Deque[T]; i: Natural; val: T) {...}{.inline.}
-
Changes the i-th element of
deq
.Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) a[0] = 99 a[3] = 66 assert $a == "[99, 20, 30, 66, 50]"
-
proc `[]`[T](deq: Deque[T]; i: BackwardsIndex): T {...}{.inline.}
-
Accesses the backwards indexed i-th element.
deq[^1]
is the last element.Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert a[^1] == 50 assert a[^4] == 20 doAssertRaises(IndexDefect, echo a[^9])
-
proc `[]`[T](deq: var Deque[T]; i: BackwardsIndex): var T {...}{.inline.}
-
Accesses the backwards indexed i-th element.
deq[^1]
is the last element.Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert a[^1] == 50 assert a[^4] == 20 doAssertRaises(IndexDefect, echo a[^9])
-
proc `[]=`[T](deq: var Deque[T]; i: BackwardsIndex; x: T) {...}{.inline.}
-
Changes the backwards indexed i-th element.
deq[^1]
is the last element.Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) a[^1] = 99 a[^3] = 77 assert $a == "[10, 20, 77, 40, 99]"
-
proc contains[T](deq: Deque[T]; item: T): bool {...}{.inline.}
-
Returns true if
item
is indeq
or false if not found.Usually used via the
in
operator. It is the equivalent ofdeq.find(item) >= 0
.
Source Editif x in q: assert q.contains(x)
-
proc addFirst[T](deq: var Deque[T]; item: T)
-
Adds an
item
to the beginning of thedeq
.See also:
Example:
Source Editvar 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: T)
-
Adds an
item
to the end of thedeq
.See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert $a == "[10, 20, 30, 40, 50]"
-
proc peekFirst[T](deq: Deque[T]): T {...}{.inline.}
-
Returns the first element of
deq
, but does not remove it from the deque.See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert $a == "[10, 20, 30, 40, 50]" assert a.peekFirst == 10 assert len(a) == 5
-
proc peekLast[T](deq: Deque[T]): T {...}{.inline.}
-
Returns the last element of
deq
, but does not remove it from the deque.See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert $a == "[10, 20, 30, 40, 50]" assert a.peekLast == 50 assert len(a) == 5
-
proc peekFirst[T](deq: var Deque[T]): var T {...}{.inline.}
-
Returns the first element of
deq
, but does not remove it from the deque.See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert $a == "[10, 20, 30, 40, 50]" assert a.peekFirst == 10 assert len(a) == 5
-
proc peekLast[T](deq: var Deque[T]): var T {...}{.inline.}
-
Returns the last element of
deq
, but does not remove it from the deque.See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert $a == "[10, 20, 30, 40, 50]" assert a.peekLast == 50 assert len(a) == 5
-
proc popFirst[T](deq: var Deque[T]): T {...}{.inline, discardable.}
-
Removes and returns the first element of the
deq
.See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) 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.}
-
Removes and returns the last element of the
deq
.See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) assert $a == "[10, 20, 30, 40, 50]" assert a.popLast == 50 assert $a == "[10, 20, 30, 40]"
-
proc clear[T](deq: var Deque[T]) {...}{.inline.}
-
Resets the deque so that it is empty.
See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addFirst(10*i) assert $a == "[50, 40, 30, 20, 10]" clear(a) assert len(a) == 0
-
proc shrink[T](deq: var Deque[T]; fromFirst = 0; fromLast = 0)
-
Removes
fromFirst
elements from the front of the deque andfromLast
elements from the back.If the supplied number of elements exceeds the total number of elements in the deque, the deque will remain empty.
See also:
Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addFirst(10*i) assert $a == "[50, 40, 30, 20, 10]" a.shrink(fromFirst = 2, fromLast = 1) assert $a == "[30, 20]"
-
proc `$`[T](deq: Deque[T]): string
- Turns a deque into its string representation. Source Edit
Iterators
-
iterator items[T](deq: Deque[T]): T
-
Yields every element of
deq
.Examples:
Source Editvar a = initDeque[int]() for i in 1 .. 3: a.addLast(10*i) for x in a: # the same as: for x in items(a): echo x # 10 # 20 # 30
-
iterator mitems[T](deq: var Deque[T]): var T
-
Yields every element of
deq
, which can be modified.Example:
Source Editvar a = initDeque[int]() for i in 1 .. 5: a.addLast(10*i) 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]
-
Yields every (position, value) of
deq
.Examples:
Source Editvar a = initDeque[int]() for i in 1 .. 3: a.addLast(10*i) for k, v in pairs(a): echo "key: ", k, ", value: ", v # key: 0, value: 10 # key: 1, value: 20 # key: 2, value: 30
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/deques.html