我应该何时使用直接访问Rust Vec而不是get方法?

Joh*_*tte 2 rust

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

let mut v = vec![1, 2, 3];

let first_element = &v[0];

let second_element = v.get(1);
Run Code Online (Sandbox Code Playgroud)

get()方法返回一个Option类型,这似乎是一个有用的安全功能.类似C语法的&v[0]类型似乎更短,但放弃了安全性好处,因为无效读取会导致运行时错误,而不是产生读取超出范围的指示.

当我想要使用直接访问方法时,我不清楚,因为它似乎唯一的优点是键入更快(我保存3个字符).我还没有看到其他一些优势(也许是加速?)?我想我会保存匹配表达式的条件,但这似乎并不像成本那样提供了很多好处.

Fre*_*ios 9

它们都没有更快,因为它们都进行了边界检查.事实上,你的问题是很普通的,因为有其他对方法,其中一人恐慌,而其他回报选项,如 String::reserveVS String::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
}
Run Code Online (Sandbox Code Playgroud)