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

标签 rust

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/

相关文章:

c++ - 通过 Qt 中的线程调用 Rust 库

hashmap - 如何有效地从 HashMap 中查找和插入?

regex - 如何在不环顾的情况下匹配单括号而不是双括号之间的单词?

rust - 期望 () 但找到了一个结构

rust - 函数调用后使用rust 的可变性要求

rust - Rust 的内存管理与编译时垃圾收集有何不同?

rust - 编译器无法推断 `impl <trait>` 的对象是否在 Rust 中实现了另一个特征

rust - 获取枚举的底层变量

rust - 有没有办法制作包含自身矢量的特征?

rust - Rust impl特性作为函数返回类型