Vector
The Vector in Move provides a flexible and dynamic array-like data structure that supports various operations such as indexing, adding, and removing elements. Vectors in Move are growable and support 0-based indexing.
Core Features of Vector
Structure
The vector module provides various native and Move functions to manage dynamic arrays:
- empty: Creates an empty vector.
- length: Returns the length of the vector.
- borrow: Returns an immutable reference to an element at a given index.
- push_back: Adds an element to the end of the vector.
- borrow_mut: Returns a mutable reference to an element at a given index.
- pop_back: Removes and returns the last element of the vector.
- destroy_empty: Destroys an empty vector.
- swap: Swaps elements at two given indices.
Constants
The following constants define various error codes used within the module:
- EINDEX_OUT_OF_BOUNDS: 0x20000
API Overview
Creating Vectors
- empty<Element>(): vector<Element>: Creates an empty vector.
- singleton<Element>(e: Element): vector<Element>: Creates a vector with a single element.
Managing Elements
- push_back<Element>(v: &mut vector<Element>, e: Element): Adds an element to the end of the vector.
- pop_back<Element>(v: &mut vector<Element>): Element: Removes and returns the last element from the vector.
- remove<Element>(v: &mut vector<Element>, i: u64): Element: Removes an element at a specific index and shifts subsequent elements.
- swap_remove<Element>(v: &mut vector<Element>, i: u64): Element: Swaps the element at the given index with the last element and removes it.
Retrieving Elements
- borrow<Element>(v: &vector<Element>, i: u64): &Element: Returns an immutable reference to an element at a given index.
- borrow_with_default<Element>(v: &vector<Element>, i: u64, default: &Element): &Element: Returns a reference to an element or a default value if the index is out of bounds.
- borrow_mut<Element>(v: &mut vector<Element>, i: u64): &mut Element: Returns a mutable reference to an element at a given index.
Utility Functions
- length<Element>(v: &vector<Element>): u64: Returns the number of elements in the vector.
- is_empty<Element>(v: &vector<Element>): bool: Checks if the vector is empty.
- contains<Element>(v: &vector<Element>, e: &Element): bool: Checks if the vector contains a given element.
- index_of<Element>(v: &vector<Element>, e: &Element): (bool, u64): Returns the index of a given element if found.
- reverse<Element>(v: &mut vector<Element>): Reverses the order of elements in the vector.
- append<Element>(lhs: &mut vector<Element>, other: vector<Element>): Appends all elements of one vector to another.
- for_each<Element>(v: vector<Element>, f: |Element|): Applies a function to each element in the vector.
- for_each_ref<Element>(v: &vector<Element>, f: |&Element|): Applies a function to a reference of each element in the vector.
- for_each_mut<Element>(v: &mut vector<Element>, f: |&mut Element|): Applies a function to a mutable reference of each element in the vector.
- fold<Accumulator, Element>(v: vector<Element>, init: Accumulator, f: |Accumulator, Element|Accumulator): Accumulator: Applies a function to accumulate a value over the elements of the vector.
- map<Element, NewElement>(v: vector<Element>, f: |Element|NewElement): vector<NewElement>: Maps a function over the elements of the vector, producing a new vector.
- filter<Element: drop>(v: vector<Element>, p: |&Element|bool): vector<Element>: Filters the vector using a predicate function.
Example Usage
Creating and Using a Vector
vector.move
module 0x42::vector_usage {
    use std::vector;
 
    public entry fun main() {
        let v = vector::empty<u64>();
        vector::push_back(&mut v, 10);
        vector::push_back(&mut v, 20);
 
        let length = vector::length(&v);
        assert!(length == 2, 0);
 
        let first_elem = vector::borrow(&v, 0);
        assert!(*first_elem == 10, 0);
 
        let second_elem = vector::borrow(&v, 1);
        assert!(*second_elem == 20, 0);
 
        let last_elem = vector::pop_back(&mut v);
        assert!(last_elem == 20, 0);
 
        vector::destroy_empty(v);
    }
}Appending Vectors
vector.move
module 0x42::vector_usage {
    use std::vector;
 
    public fun append_vectors() {
        let v1 = vector::empty<u64>();
        let v2 = vector::empty<u64>();
 
        vector::push_back(&mut v1, 1);
        vector::push_back(&mut v1, 2);
 
        vector::push_back(&mut v2, 3);
        vector::push_back(&mut v2, 4);
 
        vector::append(&mut v1, v2);
 
        let length = vector::length(&v1);
        assert!(length == 4, 0);
 
        let first_elem = vector::borrow(&v1, 0);
        assert!(*first_elem == 1, 0);
 
        let second_elem = vector::borrow(&v1, 1);
        assert!(*second_elem == 2, 0);
 
        let third_elem = vector::borrow(&v1, 2);
        assert!(*third_elem == 3, 0);
 
        let fourth_elem = vector::borrow(&v1, 3);
        assert!(*fourth_elem == 4, 0);
    }
}Removing Elements
vector.move
module 0x42::vector_usage {
    use std::vector;
 
    public fun remove_elements() {
        let v = vector::empty<u64>();
 
        vector::push_back(&mut v, 1);
        vector::push_back(&mut v, 2);
        vector::push_back(&mut v, 3);
 
        let removed_elem = vector::remove(&mut v, 1);
        assert!(removed_elem == 2, 0);
 
        let length = vector::length(&v);
        assert!(length == 2, 0);
 
        let first_elem = vector::borrow(&v, 0);
        assert!(*first_elem == 1, 0);
 
        let second_elem = vector::borrow(&v, 1);
        assert!(*second_elem == 3, 0);
    }
}Swapping Elements
vector.move
module 0x42::vector_usage {
    use std::vector;
 
    public fun swap_elements() {
        let v = vector::empty<u64>();
 
        vector::push_back(&mut v, 1);
        vector::push_back(&mut v, 2);
        vector::push_back(&mut v, 3);
 
        vector::swap(&mut v, 0, 2);
 
        let first_elem = vector::borrow(&v, 0);
        assert!(*first_elem == 3, 0);
 
        let third_elem = vector::borrow(&v, 2);
        assert!(*third_elem == 1, 0);
    }
}