Skip to content
🎉 Welcome to the new Aptos Docs! Click here to submit an issue.

Vector

Move 中的 Vector 提供了一种灵活且动态的类数组数据结构,支持多种操作,如索引、添加和移除元素。Move 的 Vector 是可增长的,并支持从 0 开始的索引。

Vector 的核心特性

结构

vector 模块提供了多种原生和 Move 层的函数,用于管理动态数组:

  • empty:创建一个空向量。
  • length:返回向量的长度。
  • borrow:返回指定索引处元素的不可变引用。
  • push_back:在向量末尾添加元素。
  • borrow_mut:返回指定索引处元素的可变引用。
  • pop_back:移除并返回向量末尾的元素。
  • destroy_empty:销毁一个空向量。
  • swap:交换两个指定索引处的元素。

常量

以下常量定义了模块中使用的各种错误码:

  • EINDEX_OUT_OF_BOUNDS:0x20000

API 概览

创建向量

  • empty<Element>(): vector<Element>:创建一个空向量。
  • singleton<Element>(e: Element): vector<Element>:创建一个包含单个元素的向量。

元素管理

  • push_back<Element>(v: &mut vector<Element>, e: Element):在向量末尾添加元素。
  • pop_back<Element>(v: &mut vector<Element>): Element:移除并返回向量末尾的元素。
  • remove<Element>(v: &mut vector<Element>, i: u64): Element:移除指定索引处的元素,并将后续元素前移。
  • swap_remove<Element>(v: &mut vector<Element>, i: u64): Element:将指定索引处的元素与末尾元素交换并移除。

元素访问

  • borrow<Element>(v: &vector<Element>, i: u64): &Element:返回指定索引处元素的不可变引用。
  • borrow_with_default<Element>(v: &vector<Element>, i: u64, default: &Element): &Element:返回指定索引处元素的引用,若越界则返回默认值。
  • borrow_mut<Element>(v: &mut vector<Element>, i: u64): &mut Element:返回指定索引处元素的可变引用。

工具函数

  • length<Element>(v: &vector<Element>): u64:返回向量中的元素数量。
  • is_empty<Element>(v: &vector<Element>): bool:判断向量是否为空。
  • contains<Element>(v: &vector<Element>, e: &Element): bool:判断向量是否包含指定元素。
  • index_of<Element>(v: &vector<Element>, e: &Element): (bool, u64):返回指定元素的索引(如存在)。
  • reverse<Element>(v: &mut vector<Element>):反转向量中元素的顺序。
  • append<Element>(lhs: &mut vector<Element>, other: vector<Element>):将另一个向量的所有元素追加到当前向量。
  • for_each<Element>(v: vector<Element>, f: |Element|):对向量中的每个元素应用函数。
  • for_each_ref<Element>(v: &vector<Element>, f: |&Element|):对向量中每个元素的引用应用函数。
  • for_each_mut<Element>(v: &mut vector<Element>, f: |&mut Element|):对向量中每个元素的可变引用应用函数。
  • fold<Accumulator, Element>(v: vector<Element>, init: Accumulator, f: |Accumulator, Element|Accumulator): Accumulator:对向量元素进行累积操作。
  • map<Element, NewElement>(v: vector<Element>, f: |Element|NewElement): vector<NewElement>:对向量中的每个元素应用函数,生成新向量。
  • filter<Element: drop>(v: vector<Element>, p: |&Element|bool): vector<Element>:使用谓词函数过滤向量。

示例用法

创建与使用 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);
    }
}

向量追加

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);
    }
}

移除元素

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);
    }
}

元素交换

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);
    }
}

源码链接

其他示例