Rust 支持两种访问向量元素的方法:
let mut v = vec![1, 2, 3];
let first_element = &v[0];
let second_element = v.get(1);
get()
方法返回一个 Option 类型,这似乎是一个有用的安全特性。类似 C 的语法 &v[0]
看起来更短,但放弃了安全优势,因为无效读取会导致运行时错误,而不是产生读取越界的指示。
我不清楚何时要使用直接访问方法,因为它似乎唯一的优点是输入速度更快(我节省了 3 个字符)。还有其他一些我没有看到的优势(也许是加速?)?我想我会保存匹配表达式的条件,但与成本相比,它似乎并没有提供太多好处。
最佳答案
它们都不是更快,因为它们都进行边界检查。实际上,您的问题非常笼统,因为还有其他一对方法,其中一个方法出现 panic ,而另一个方法返回一个选项,例如 String::reserve
对比String::try_reserve
.
- 如果您确定自己在边界内,请使用括号版本。这只是
get().unwrap()
的语法快捷方式。 - 如果您不确定这一点,请使用
get()
方法进行检查。 - 如果您迫切需要最大速度并且您不能使用迭代器并且您已经通过基准测试确定索引是瓶颈并且您一定要在边界内,可以使用
get_unchecked()
方法。请注意这一点,因为它是不安全的
:最好不要在代码中包含任何unsafe
block 。
一点建议:如果您担心程序性能,请避免使用这些方法,而更喜欢尽可能多地使用迭代器。例如,第二个示例比第一个示例更快,因为在第一个示例中有 100 万次边界检查:
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
}
关于rust - 我什么时候应该使用直接访问 Rust Vec 而不是 get 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51899535/