我正在寻找一种方法consumes a Vec
并返回一个元素,无需恢复的开销Vec
的不变量的方式remove
and swap_remove
do:
fn take<T>(vec: Vec<T>, index: usize) -> Option<T>
但是,我找不到这样的方法。我错过了什么吗?这实际上不安全或不可能吗?
这是一个不同的问题内置*安全*方式来移出 Vec? https://stackoverflow.com/questions/37489004/built-in-safe-way-to-move-out-of-vect那里的目标是remove
方法不会因越界访问而恐慌并返回Result
。我正在寻找一种消耗的方法Vec
并返回元素之一。上述问题的答案都没有解决我的问题。
你可以这样写你的函数:
fn take<T>(mut vec: Vec<T>, index: usize) -> Option<T> {
if vec.get(index).is_none() {
None
} else {
Some(vec.swap_remove(index))
}
}
代码你see here (get
and swap_remove
) 保证为 O(1)。
However,有点隐藏,vec
在函数末尾被删除,并且此删除操作可能不是 O(1),而是 O(n)(其中 n 是vec.len()
). If T
实施Drop
, then drop()
为向量内的每个元素调用,这意味着删除向量的时间复杂度为 O(n)。如果T
不实施Drop
,那么Vec
只需要释放内存。的时间复杂度为dealloc
操作取决于分配器并且没有指定,所以我们不能假设它是 O(1)。
提到使用迭代器的另一种解决方案:
fn take<T>(vec: Vec<T>, index: usize) -> Option<T> {
vec.into_iter().nth(index)
}
While Iterator::nth()
通常是一个线性时间操作,向量上的迭代器重写这个方法 https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.advance_by使其成为 O(1) 操作。当然,如果T
实施Drop
,这又是一个 O(n) 函数,因为需要删除 n 个元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)