迭代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()
}