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