什么时候应该使用直接访问Rust Vec而不是get方法?

时间:2018-08-17 16:25:18

标签: rust

Rust支持两种访问向量元素的方法:

No matches found for first match sequence

let mut v = vec![1, 2, 3]; let first_element = &v[0]; let second_element = v.get(1); 方法返回一个Option类型,这似乎是一个有用的安全功能。类似C的语法get()看起来更短,但是却放弃了安全性,因为无效的读取会导致运行时错误,而不是产生读取超出范围的指示。

我尚不清楚何时要使用直接访问方法,因为似乎唯一的好处是键入速度更快(我节省了3个字符)。还有其他我没有看到的优势(也许是提速吗?)?我想我会保存匹配表达式的条件,但是与成本相比,它似乎没有太大的好处。

1 个答案:

答案 0 :(得分:9)

它们都不快,因为它们都进行边界检查。实际上,您的问题很笼统,因为在其他方法对中,其中一个恐慌而另一对返回选项,例如String::reserveString::try_reserve

  • 如果您确定自己会陷入困境,请使用方括号版本。这只是get().unwrap()的语法快捷方式。
  • 如果不确定这一点,请使用get()方法并进行检查。
  • 如果您迫切需要最大速度,并且并且,则不能使用迭代器,并且您已通过基准测试确定索引是瓶颈,并且当然可以,您可以使用get_unchecked()方法。请注意这一点,因为它unsafe:最好在代码中不要包含任何unsafe块。

仅需一点建议:如果您对程序的性能感到担心,请避免使用这些方法,而应尽可能使用迭代器。例如,第二个示例比第一个示例快,因为在第一种情况下,有一百万个边界检查:

let v: Vec<_> = (0..1000_000).collect();

for idx in 0..1000_000 {
    // do something with v[idx]
}

for num in &v {
    // do something with num
}