跳转至

容器 std.container

通用成员

容器通用成员定义(如果 xxx 是一个容器):
通用成员并不是在每种容器上都可用,而是规定容器中同名成员存在时的行为。

只读属性

size;          // 表示容器内元素所占据的字节数
length;        // 表示容器内元素的个数
capacity;      // 表示容器内元素的最大个数
is_resizeable; // 表示容器是否可以调整大小
is_empty;      // 表示容器是否为空

通用函数

// 清空容器
fun clear() -> unit;

// 调整容器大小
fun resize(usize n) -> unit;

// 保留容器容量
fun reserve(usize n) -> unit;

// 缩小容器容量到实际大小
fun shrink_to_fit() -> unit;

// 向容器默认位置添加元素
fun push(T x) -> unit;

// 从容器默认位置删除元素
fun pop() -> T;

// 向容器末尾添加元素
fun append(T x) -> unit;

// 向容器开头添加元素
fun prepend(T x) -> unit;

// 在指定位置插入元素
fun insert(usize pos, T x) -> unit;

// 删除指定位置的元素
fun erase(usize pos) -> T;

// 获取指定位置的元素
fun at(usize pos) -> T;

// 获取指定键的元素值(映射专用)
fun get(K key) -> Option<V>;

// 设置指定键的元素值(映射专用)
fun set(K key, V value) -> unit;

// 删除指定键的元素(映射专用)
fun remove(K key) -> Option<V>;

// 判断是否包含元素
fun contains(T value) -> bool;

// 获取元素在容器中的位置
fun find(T value) -> Option<usize>;

// 遍历容器
fun for_each(act[%] f) -> unit;

// 克隆容器
fun clone() -> T;

运算符重载

// 连接:创建新容器包含两个容器的所有元素
c1 + c2

// 差集:创建新容器包含在c1但不在c2的元素
c1 - c2

// 交集:创建新容器包含在两个容器中都存在的元素
c1 & c2

// 并集:同 c1 + c2
c1 | c2

// 对称差:创建新容器包含在两个容器中但不同时存在的元素
c1 ^ c2

// 左移:向容器默认插入位置添加元素
c << x

// 右移:从容器默认删除位置删除元素
c >> x

// 索引访问
c[i]

类型转换

// 容器转布尔:如果容器为空则为 false,否则为 true
fun to_bool() -> bool;

// 容器转字符串
fun to_string() -> str;

迭代器

所有容器都提供迭代器支持。

Iterator</typename T/> {
    // 检查是否有下一个元素
    fun has_next() -> bool;

    // 获取下一个元素
    fun next() -> T;

    // 获取当前位置
    fun position() -> usize;
}

// 获取容器迭代器
fun iter() -> Iterator<T>;

// 获取可变迭代器
fun iter_mut() -> Iterator<T>;

// 获取反向迭代器
fun iter_rev() -> Iterator<T>;

迭代器使用示例

use std.container.*;

act main() {
    val numbers = [1, 2, 3, 4, 5];

    // 使用 for 循环
    for num in numbers {
        println(num);
    }

    // 手动迭代
    var it = numbers.iter();
    while it.has_next() {
        println(it.next());
    }
}

有序集合

按照插入顺序排列的集合类型。

数组 Array

Array</typename T, usize N/> {
    fun new() -> Array<T, N>;
    fun from([T] slice) -> Array<T, N>;
}

// 固定大小数组
[i32; 5] arr = [1, 2, 3, 4, 5];
arr[0] = 10;

特性

  • 固定大小,栈分配
  • 零开销抽象
  • 支持编译期大小检查

列表 List

List</typename T/> {
    fun new() -> List<T>;
    fun with_capacity(usize cap) -> List<T>;
}

// 动态数组
val list = List::<i32>::new();
list.push(1);
list.push(2);
list.push(3);

特性

  • 动态大小,堆分配
  • O(1) 随机访问
  • O(1) 末尾插入/删除
  • O(n) 首部插入/删除

链表 LinkedList

LinkedList</typename T/> {
    fun new() -> LinkedList<T>;
}

val list = LinkedList::<i32>::new();
list.push_back(1);
list.push_front(0);

特性

  • O(1) 两端插入/删除
  • O(n) 随机访问
  • O(n) 空间开销

队列 Queue

Queue</typename T/> {
    fun new() -> Queue<T>;

    // 入队
    fun push(T x) -> unit;

    // 出队
    fun pop() -> T;

    // 查看队头
    fun front() -> T;
}

val q = Queue::<i32>::new();
q.push(1);
q.push(2);
i32 x = q.pop(); // x = 1

特性

  • FIFO(先进先出)
  • O(1) 入队/出队

栈 Stack

Stack</typename T/> {
    fun new() -> Stack<T>;

    // 压栈
    fun push(T x) -> unit;

    // 弹栈
    fun pop() -> T;

    // 查看栈顶
    fun top() -> T;
}

val stack = Stack::<i32>::new();
stack.push(1);
stack.push(2);
i32 x = stack.pop(); // x = 2

特性

  • LIFO(后进先出)
  • O(1) 压栈/弹栈

无序集合

元素排列与插入顺序无关的集合类型。

哈希集 HashSet

HashSet</typename T/> {
    fun new() -> HashSet<T>;
    fun with_capacity(usize cap) -> HashSet<T>;
    fun insert(T x) -> bool;         // 返回是否插入成功
    fun remove(T x) -> bool;         // 返回是否移除成功
    fun contains(T x) -> bool;
}

val set = HashSet::<i32>::new();
set.insert(1);
set.insert(2);
bool found = set.contains(1);

特性

  • O(1) 平均查找/插入/删除
  • 无序存储
  • 需要实现 Hash trait

排序集合

元素自动排序的集合类型。

集合 Set

Set</typename T/> {
    fun new() -> Set<T>;
    fun insert(T x) -> bool;
    fun remove(T x) -> bool;
    fun contains(T x) -> bool;
    fun min() -> T;
    fun max() -> T;
}

val set = Set::<i32>::new();
set.insert(3);
set.insert(1);
set.insert(2);  // 自动排序:1, 2, 3

特性

  • 红黑树实现
  • O(log n) 插入/删除/查找
  • 自动排序

优先队列 PriorityQueue

MinPQ</typename T/> {  // 最小堆
    fun new() -> MinPQ<T>;
    fun push(T x) -> unit;
    fun pop() -> T;
    fun top() -> T;
}

MaxPQ</typename T/> {  // 最大堆
    fun new() -> MaxPQ<T>;
    fun push(T x) -> unit;
    fun pop() -> T;
    fun top() -> T;
}

val pq = MinPQ::<i32>::new();
pq.push(3);
pq.push(1);
pq.push(2);
i32 min = pq.pop();  // min = 1

特性

  • 堆实现
  • O(log n) 插入/删除
  • O(1) 查看最值

有序映射

按插入顺序维护键值对的映射类型。

数组映射 ArrayMap

ArrayMap</typename K, typename V, usize N/> {
    fun new() -> ArrayMap<K, V, N>;
    fun set(K key, V value) -> unit;
    fun get(K key) -> Option<V>;
}

特性

  • 固定大小,栈分配
  • O(n) 查找

列表映射 ListMap

ListMap</typename K, typename V/> {
    fun new() -> ListMap<K, V>;
    fun set(K key, V value) -> unit;
    fun get(K key) -> Option<V>;
}

特性

  • 动态大小,基于列表
  • O(n) 查找

链表映射 LinkedListMap

LinkedListMap</typename K, typename V/> {
    fun new() -> LinkedListMap<K, V>;
    fun set(K key, V value) -> unit;
    fun get(K key) -> Option<V>;
}

特性

  • 基于链表
  • O(n) 查找

无序映射

哈希表实现的映射类型。

哈希映射 HashMap

HashMap</typename K, typename V/> {
    fun new() -> HashMap<K, V>;
    fun with_capacity(usize cap) -> HashMap<K, V>;
    fun set(K key, V value) -> unit;
    fun get(K key) -> Option<V>;
    fun remove(K key) -> Option<V>;
    fun contains_key(K key) -> bool;
    fun keys() -> Iterator<K>;
    fun values() -> Iterator<V>;
    fun entries() -> Iterator<(K, V)>;
}

val map = HashMap::<str, i32>::new();
map.set("age", 25);
Option<i32> age = map.get("age");

特性

  • O(1) 平均查找/插入/删除
  • 无序存储
  • 需要实现 Hash trait

排序映射

红黑树实现的映射类型。

映射 Map

Map</typename K, typename V/> {
    fun new() -> Map<K, V>;
    fun set(K key, V value) -> unit;
    fun get(K key) -> Option<V>;
    fun remove(K key) -> Option<V>;
    fun contains_key(K key) -> bool;
    fun first() -> Option<(K, V)>;
    fun last() -> Option<(K, V)>;
    fun keys() -> Iterator<K>;
    fun values() -> Iterator<V>;
}

val map = Map::<str, i32>::new();
map.set("alice", 25);
map.set("bob", 30);
// 自动按键排序

特性

  • O(log n) 查找/插入/删除
  • 按键自动排序
  • 范围查询支持

容器性能对比表

容器 索引 前插 后插 查找 排序 内存
Array O(1) - - O(n)
List O(1) O(n) O(1) O(n)
LinkedList O(n) O(1) O(1) O(n)
Queue - - O(1) O(n)
Stack - - O(1) O(n)
HashSet - - - O(1)
Set - - - O(log n)
HashMap - - - O(1)
Map - - - O(log n)

使用示例

use std.container.*;

act main() {
    // 列表操作
    val numbers = List::<i32>::new();
    numbers.push(10);
    numbers.push(20);
    numbers.push(30);

    for num in numbers {
        println(num);
    }

    // 哈希映射
    val map = HashMap::<str, i32>::new();
    map.set("apple", 5);
    map.set("banana", 3);
    map.set("orange", 2);

    if let Option::Some(count) = map.get("apple") {
        println(count);
    }

    // 优先队列
    val pq = MinPQ::<i32>::new();
    [10, 3, 7, 1, 5].iter().for_each(|x| pq.push(x));

    while !pq.is_empty() {
        println(pq.pop());  // 输出:1 3 5 7 10
    }
}

相关内容:类型系统见 类型系统