迭代Rust Vec的首选方法?
对于以下代码,迭代Rust Vec的首选方法?,rust,Rust,对于以下代码,first\u word2()是否优于first\u word1(),因为它不会复制项目 fn first_word1(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return i; } }
first\u word2()
是否优于first\u word1()
,因为它不会复制项目
fn first_word1(s: &String) -> usize {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
s.len()
}
fn first_word2(s: &String) -> usize {
let bytes = s.as_bytes();
for (i, item) in bytes.iter().enumerate() {
if *item == b' ' {
return i;
}
}
s.len()
}
迭代一个Vec
怎么样?对于中的(i,项目)是否首选,而对于
中的(i,项目)是否首选
编辑:
以下是Vec
的版本:
fn查找空间1(v:&Vec)->使用{
对于v.iter()中的(i,&项)。枚举(){
如果项目==“”{
返回i;
}
}
v、 len()
}
fn查找空间2(v:&Vec)->使用{
对于v.iter()中的(i,项)枚举{
如果项目==“”{
返回i;
}
}
v、 len()
}
您的两个代码片段在语义上是等价的。如果您:
- 通过
(i,&item)
解构引用,然后直接使用item
,或
- 对于每种用法,取消对
项的引用,如*项的引用
它们将编译成相同的机器代码,因此在速度或任何方面都没有差异。选择其中一个而不是另一个的唯一原因是:你需要输入多少。例如,如果您的条件是item==b'.\124; item==b'.
,那么我会说分解(I,&item)
解决方案更好,因为您只需要一个&
,而不是两个*
如果Vec
的首选解决方案是(i,item)
(而不是(i,item)
),那么迭代Vec
如何
这两个版本都不能与String
一起使用,因为它不实现Copy
。但是您也不需要为了比较它而复制/克隆它<当s
是字符串时,code>s==”
工作正常
与您的问题无关,您可以通过另一种方式改进代码:使用迭代器链
fn第一个\u空格(s:&String)->使用{
s、 字节().位置(| b | b==b'').展开或(s.len())
}
改进:
String::bytes
是迭代字符串字节的更简单方法
Iterator::position
已经实现了您的for
循环正在实现的逻辑
unwrap\u或
是提供备用方案的理想选择
谢谢。我认为第二个版本(find_space2()
)可以在Vec
中使用,请参阅我编辑的代码片段。@mitnk好的,您的Vec
的第二个版本不包括取消引用操作*项
。因此,它与第二版的Vec
不同。但是是的,它是有效的。对于Vec
,
版本中(i,&item)的不起作用,因为字符串
没有实现复制
。这是否意味着版本中(i,项目)的是更好的版本,而不是复制项目的版本?
fn find_space1(v: &Vec<String>) -> usize {
for (i, &item) in v.iter().enumerate() {
if item == " " {
return i;
}
}
v.len()
}
fn find_space2(v: &Vec<String>) -> usize {
for (i, item) in v.iter().enumerate() {
if item == " " {
return i;
}
}
v.len()
}