Author: | Kaushal Modi |
---|---|
License: | MIT |
Introduction
Nim wrapper to map with the C++ std::vector library.
Source
Types
Vector[T] {.importcpp: "std::vector".} = object
VectorIter[T] {.importcpp: "std::vector<\'0>::iterator".} = object
VectorConstIter[T] {.importcpp: "std::vector<\'0>::const_iterator".} = object
SizeType = csize_t
Procs
proc initVector[T](): Vector[T] {.importcpp: "std::vector<\'*0>()", constructor, header: "<vector>".}
proc initVector[T](size: SizeType): Vector[T] {. importcpp: "std::vector<\'*0>(#)", constructor, header: "<vector>".}
proc len(v: Vector): SizeType {.importcpp: "#.size()", header: "<vector>".}
-
Return the number of elements in the Vector.
This has an alias proc size.
https://en.cppreference.com/w/cpp/container/vector/size
Example:
var v = initVector[int]() doAssert v.size() == 0 v.add(100) v.add(200) doAssert v.len() == 2
proc empty(v: Vector): bool {.importcpp: "empty", header: "<vector>".}
-
Check if the Vector is empty i.e. has zero elements.
https://en.cppreference.com/w/cpp/container/vector/empty
Example:
var v = initVector[int]() doAssert v.empty() v.add(100) doAssert not v.empty()
proc `[]`[T](v: Vector[T]; idx: SizeType): var T {.importcpp: "#[#]", header: "<vector>".}
-
Return the reference to v[idx].
Example:
var v = initVector[char]() v.add('a') v.add('b') v.add('c') v[1] = 'z' doAssert v[0] == 'a' doAssert v[1] == 'z' doAssert v[2] == 'c'
proc first[T](v: Vector[T]): var T {.importcpp: "front", header: "<vector>".}
-
Return the reference to the first element of the Vector.
This has an alias proc front.
https://en.cppreference.com/w/cpp/container/vector/front
Example:
var v = initVector[int]() v.add(100) v.add(200) doAssert v.first() == 100 v.first() = 300 doAssert v.first() == 300 doAssert v.first() == v.front()
proc last[T](v: Vector[T]): var T {.importcpp: "back", header: "<vector>".}
-
Return the reference to the last element of the Vector.
This has an alias proc back.
https://www.cplusplus.com/reference/vector/vector/back/
Example:
var v = initVector[int]() v.add(100) v.add(200) doAssert v.last() == 200 v.last() = 300 doAssert v.last() == 300 doAssert v.last() == v.back()
proc assign[T](v: var Vector[T]; num: SizeType; val: T) {. importcpp: "#.assign(@)", header: "<vector>".}
-
Return a Vector with num elements assigned to the specified value val.
https://en.cppreference.com/w/cpp/container/vector/assign
Example:
var v: Vector[float] v.assign(5, 1.0) doAssert v.toSeq() == @[1.0, 1.0, 1.0, 1.0, 1.0] v.assign(2, 2.3) doAssert v.toSeq() == @[2.3, 2.3]
proc `==`[T](a: Vector[T]; b: Vector[T]): bool {.importcpp: "# == #", header: "<vector>".}
-
Return true if the contents of lhs and rhs are equal, that is, they have the same number of elements and each element in lhs compares equal with the element in rhs at the same position.
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
Example:
let v1 = @[1, 2, 3].toVector() v2 = v1 doAssert v1 == v2
proc `!=`[T](a: Vector[T]; b: Vector[T]): bool {.importcpp: "# != #", header: "<vector>".}
-
Return true if the contents of lhs and rhs are not equal, that is, either they do not have the same number of elements, or one of the elements in lhs does not compare equal with the element in rhs at the same position.
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
Example:
let v1 = @[1, 2, 3].toVector() var v2 = v1 v3 = v1 v2.add(4) doAssert v2 != v1 v3[0] = 100 doAssert v3 != v1
proc `<`[T](a: Vector[T]; b: Vector[T]): bool {.importcpp: "# < #", header: "<vector>".}
-
Return true if a is lexicographically less than b.
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
Example:
let v1 = @[1, 2, 3].toVector() var v2 = v1 doAssert not (v1 < v2) v2.add(4) doAssert v1 < v2 v2[2] = 0 doAssert v2 < v1
proc `<=`[T](a: Vector[T]; b: Vector[T]): bool {.importcpp: "# <= #", header: "<vector>".}
-
Return true if a is lexicographically less than or equal to b.
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
Example:
let v1 = @[1, 2, 3].toVector() var v2 = v1 doAssert v1 <= v2 v2.add(4) doAssert v1 <= v2 v2[2] = 0 doAssert v2 <= v1
proc `>`[T](a: Vector[T]; b: Vector[T]): bool {.importcpp: "# > #", header: "<vector>".}
-
Return true if a is lexicographically greater than b.
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
Example:
let v1 = @[1, 2, 3].toVector() var v2 = v1 doAssert not (v2 > v1) v2.add(4) doAssert v2 > v1 v2[2] = 0 doAssert v1 > v2
proc `>=`[T](a: Vector[T]; b: Vector[T]): bool {.importcpp: "# >= #", header: "<vector>".}
-
Return true if a is lexicographically greater than or equal to b.
https://en.cppreference.com/w/cpp/container/vector/operator_cmp
Example:
let v1 = @[1, 2, 3].toVector() var v2 = v1 doAssert v2 >= v1 v2.add(4) doAssert v2 >= v1 v2[2] = 0 doAssert v1 >= v2
proc `+`[T: VectorIter | VectorConstIter](iter: T; offset: int): T {. importcpp: "# + #", header: "<vector>".}
-
Return an updated iterator pointing to the input iterator plus the specified offset.
Example:
var v = @[1.0, 2.0, 3.0].toVector() discard v.insert(v.cBegin()+1, 1.5) doAssert v.toSeq() == @[1.0, 1.5, 2.0, 3.0] discard v.insert(v.begin()+3, 2.5) doAssert v.toSeq() == @[1.0, 1.5, 2.0, 2.5, 3.0]
proc `-`[T: VectorIter | VectorConstIter](iter: T; offset: int): T {. importcpp: "# - #", header: "<vector>".}
-
Return an updated iterator pointing to the input iterator minus the specified offset.
Example:
var v = @[1.0, 2.0, 3.0].toVector() discard v.insert(v.cEnd()-1, 2.5) doAssert v.toSeq() == @[1.0, 2.0, 2.5, 3.0] discard v.insert(v.`end`()-3, 1.5) doAssert v.toSeq() == @[1.0, 1.5, 2.0, 2.5, 3.0]
proc begin[T](v: Vector[T]): VectorIter[T] {.importcpp: "begin", header: "<vector>".}
-
Return a mutable C++ iterator pointing to the beginning position of the Vector.
https://www.cplusplus.com/reference/vector/vector/begin/
Example:
var v = @[1, 2, 3].toVector() discard v.insert(v.begin(), 100) doAssert v.toSeq() == @[100, 1, 2, 3]
proc cBegin[T](v: Vector[T]): VectorConstIter[T] {.importcpp: "cbegin", header: "<vector>".}
-
Return an immutable C++ iterator pointing to the beginning position of the Vector.
https://www.cplusplus.com/reference/vector/vector/begin/
Example:
var v = @[1, 2, 3].toVector() discard v.insert(v.cBegin(), 100) doAssert v.toSeq() == @[100, 1, 2, 3]
proc `end`[T](v: Vector[T]): VectorIter[T] {.importcpp: "end", header: "<vector>".}
-
Return a mutable C++ iterator pointing to after the end position of the Vector.
https://www.cplusplus.com/reference/vector/vector/end/
Example:
var v = @[1, 2, 3].toVector() discard v.insert(v.`end`(), 100) doAssert v.toSeq() == @[1, 2, 3, 100]
proc cEnd[T](v: Vector[T]): VectorConstIter[T] {.importcpp: "cend", header: "<vector>".}
-
Return an immutable C++ iterator pointing to after the end position of the Vector.
https://www.cplusplus.com/reference/vector/vector/end/
Example:
var v = @[1, 2, 3].toVector() discard v.insert(v.cEnd(), 100) doAssert v.toSeq() == @[1, 2, 3, 100]
proc add[T](v: var Vector[T]; elem: T) {.importcpp: "#.push_back(#)", header: "<vector>".}
-
Append a new element to the end of the Vector.
This has an alias proc pushBack.
https://en.cppreference.com/w/cpp/container/vector/push_back
Example:
var v = initVector[int]() doAssert v.len() == 0 v.add(100) v.pushBack(200) doAssert v.len() == 2
proc popBack[T](v: var Vector[T]) {.importcpp: "pop_back", header: "<vector>".}
-
Remove the last element of the Vector. This proc does not return anything.
https://www.cplusplus.com/reference/vector/vector/pop_back/
Example:
var v = initVector[int]() doAssert v.len() == 0 v.add(100) doAssert v.len() == 1 v.popBack() doAssert v.len() == 0
proc insert[T](v: var Vector[T]; pos: VectorConstIter[T]; val: T): VectorIter[T] {. importcpp: "insert", header: "<vector>".}
-
Insert an element before the specified position.
Example:
var v = @['a', 'b'].toVector() discard v.insert(v.cBegin(), 'c') doAssert v.toSeq() == @['c', 'a', 'b']
proc insert[T](v: var Vector[T]; pos: VectorConstIter[T]; count: SizeType; val: T): VectorIter[T] {.importcpp: "insert", header: "<vector>".}
-
Insert count copies of element before the specified position.
Example:
var v = @['a', 'b'].toVector() discard v.insert(v.cBegin(), 3, 'c') doAssert v.toSeq() == @['c', 'c', 'c', 'a', 'b']
proc insert[T](v: var Vector[T]; pos, first, last: VectorConstIter[T]): VectorIter[ T] {.importcpp: "insert", header: "<vector>".}
-
Insert elements from range first ..< last before the specified position.
Example:
let v1 = @['a', 'b'].toVector() var v2: Vector[char] discard v2.insert(v2.cBegin(), v1.cBegin(), v1.cEnd()) doAssert v2.toSeq() == @['a', 'b']
proc swap[T](v1, v2: var Vector[T]) {.importcpp: "swap", header: "<vector>".}
-
Swap the contents of vectors v1 and v2.
https://en.cppreference.com/w/cpp/container/vector/swap
Example:
var v1 = @[1, 2, 3].toVector() v2 = @[7, 8, 9].toVector() v1.swap(v2) doAssert v1.toSeq() == @[7, 8, 9] doAssert v2.toSeq() == @[1, 2, 3]
proc size(v: Vector): SizeType {.inline.}
- Alias for len proc.
proc pushBack[T](v: var Vector[T]; elem: T) {.inline.}
- Alias for add proc.
proc front[T](v: Vector[T]): T {.inline.}
- Alias for first proc.
proc back[T](v: Vector[T]): T {.inline.}
- Alias for last proc.
proc `[]=`[T](v: var Vector[T]; idx: SizeType; val: T) {.inline.}
-
Set the value at v[idx] to the specified value val.
Example:
var v = initVector[int](2) doAssert v.toSeq() == @[0, 0] v[0] = -1 doAssert v.toSeq() == @[-1, 0]
proc toSeq[T](v: Vector[T]): seq[T]
-
Convert a Vector to a sequence.
Example:
var v: Vector[char] v.assign(3, 'k') doAssert v.toSeq() == @['k', 'k', 'k']
proc toVector[T](s: openArray[T]): Vector[T]
-
Convert an array/sequence to a Vector.
Example:
let s = @[1, 2, 3] a = [1, 2, 3] doAssert s.toVector().toSeq() == s doAssert a.toVector().toSeq() == s
proc `$`[T](v: Vector[T]): string {.noinit.}
-
The $ operator for Vector type variables. This is used internally when calling echo on a Vector type variable.
Example:
var v = initVector[int]() doAssert $v == "v[]" v.add(100) v.add(200) doAssert $v == "v[100, 200]"
Iterators
iterator items[T](v: Vector[T]): T
-
Iterate over all the elements in Vector v.
Example:
var v: Vector[int] sum: int v.assign(3, 5) for elem in v: sum += elem doAssert sum == 15
iterator pairs[T](v: Vector[T]): (SizeType, T)
-
Iterate over (index, value) for all the elements in Vector v.
Example:
var v: Vector[int] sum: int v.assign(3, 5) for idx, elem in v: sum += idx.int + elem doAssert sum == 18
Converters
converter VectorIterToVectorConstIter[T](x: VectorIter[T]): VectorConstIter[T] {. importcpp: "#", header: "<vector>".}
- Implicitly convert mutable C++ iterator to immutable C++ iterator.