Block-List<T>
BlockList 是一种基于分块技术的线性容器。与通用的 BlockArray 不同,BlockList 通过放弃批量插入的能力,只提供了较快的单点插入功能。保证了访问效率始终为 O(1),且效率与原生数组一致。通过分块技术,我们可以分摊内存重排的开销,将插入、删除的复杂度维持在 O(B/w + N/B)。见 基准测试。
export class BlockList<T> extends InternalIterable<T>;| 方法 | 描述 |
|---|---|
| constructor(blockSize = 512) | 构造实例。blockSize (即 B) 会被自动向上取整到 2 的幂。 |
| 方法 | 描述 | 复杂度 |
|---|---|---|
| at(index) | 访问指定位置的元素,支持负数索引。 | O(1) |
| get(index) | 访问指定位置的元素。 | O(1) |
| set(index, value) | 替换指定位置的元素。 | O(1) |
| 方法 | 描述 | 复杂度 |
|---|---|---|
| push(…values) | 在末尾添加元素。 | O(1) |
| pushAll(values[]) | 在末尾添加元素,参数为数组。 | O(1) |
| pop() | 弹出末尾元素。 | O(1) |
| shift() | 弹出头部元素。 | O(B + N/B) |
| unshift(…values) | 在头部插入一个或多个元素。 | O(K · N/B) |
| insert(index, value) | 在指定位置插入。 | O(B + N/B) |
| delete(index) | 删除指定位置的元素,并返回它。 | O(B + N/B) |
| deleteCursor(cur) | 删除游标指向的元素,并返回它。 | O(B + N/B) |
| 方法 | 描述 | 复杂度 |
|---|---|---|
| splice(start, count?, …items) | 切片修改. 支持批量删除和插入. | O(K · N/B) |
| spliceAll(start, count?, items[]) | 切片修改. 支持批量删除和插入. | O(K · N/B) |
| slice(start?, end?) | 返回一个指定范围的浅拷贝 BlockList。 | O(K) |
| concat(…items) | 拼接元素、数组、或 BlockList。返回一个新的 BlockList。 | O(K) |
| reverse() | 原地反转容器内的所有元素。 | O(N) |
| rebase(newBlockSize?) | 重新组织底层块存储。修改 blockSize。 | O(N) |
迭代器与游标
Section titled “迭代器与游标”| 方法 | 描述 |
|---|---|
| cursor(index = 0) | 返回一个指向指定索引的双向随机访问游标。 |
| [Symbol.iterator]() | 返回原生迭代器,支持 for..of 循环。 |
| 方法 | 描述 | 复杂度 |
|---|---|---|
| length | 返回元素总数。 | O(1) |
| capacity | 返回当前对象池能容纳的最大元素数(无新分配)。 | O(1) |
| isEmpty() | 检查列表是否为空。 | O(1) |
| resize(newSize, fillValue?) | 调整容器大小。缩小时截断数据,扩大时填充 fillValue。 | O(K) |
| reserve(n) | 预分配物理块,确保至少能容纳 n 个元素。 | O(N) |
| shrinkToFit() | 释放内存池中闲置的物理块,等待 GC。 | O(1) |
| clear(reuse = true) | 清空容器。reuse 为时将物理块回收进对象池。 | O(1) 或 O(N) |
clear 在 resue = true 时,效率为 O(N),并将解除对用户数据的引用。