标准库的链表Node 使用以下Option类型:
struct Node<T> {
next: Option<NonNull<Node<T>>>,
prev: Option<NonNull<Node<T>>>,
element: T,
}
Run Code Online (Sandbox Code Playgroud)
并使用以下代码创建节点:
Node {
next: None,
prev: None,
element,
}
Run Code Online (Sandbox Code Playgroud)
执行LeafNode的BTree,标准库使用父节点的原始指针:
struct LeafNode<K, V> {
parent: *const InternalNode<K, V>,
parent_idx: MaybeUninit<u16>,
len: u16,
keys: MaybeUninit<[K; CAPACITY]>,
vals: MaybeUninit<[V; CAPACITY]>,
}
Run Code Online (Sandbox Code Playgroud)
并通过设置parent为ptr::null:创建新的叶节点:
LeafNode {
keys: MaybeUninit::uninitialized(),
vals: MaybeUninit::uninitialized(),
parent: ptr::null(),
parent_idx: MaybeUninit::uninitialized(),
len: 0
}
Run Code Online (Sandbox Code Playgroud)
我们可以使用nullptr以实现C++上面的代码,有啥之间的区别Option,并std::ptr::null()表示一个空指针?表示空指针的推荐方法是什么?
一般情况下,我建议使用NonNull<T>over *const T或*mut T使用Option适当的方法来识别指针何时为空.
原因有两方面:
NonNull.*const T并且*mut T基本上是可互换的,并且实际上可以相互铸造,以便const或mut可以提供虚假的安全感.实施BTree可能根本没有移植到NonNull,这是相对较新的 - 它仅在1.25稳定.
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |