在 C 语言家族中,我可以在一行中做到这一点:
for(int i = lo, int j = mid+1; i <= mid && j <= hi; i++, j++){
...
}
Run Code Online (Sandbox Code Playgroud)
但是在 Rust 中……我只能这样写:
for i in lo..mid+1 {
let mut j = mid+1;
if j <= hi {
break;
}
...
j += 1;
}
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来实现这一点?
使用迭代器适用于上述情况,但使用迭代器会使某些场合使用算术变得麻烦,例如
for i in lo..mid+1 {
let mut j = mid+1;
if j <= hi {
break;
}
...
j += 1;
}
Run Code Online (Sandbox Code Playgroud)
在 Rust 中,这不起作用。变量i不会增加 5,而是增加 1:
for i in 0..n {
if a[i] == ... {
i += 5;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以创建两个并行范围迭代器zip,然后通过组合进行迭代:
fn main() {
let values = [10, 20, 30, 40, 50, 60, 70, 80, 90];
let lo = 2;
let mid = 5;
let hi = 7;
let early_indexes = lo..(mid + 1);
let late_indexes = (mid + 1)..(hi + 1);
for (i, j) in early_indexes.zip(late_indexes) {
println!("{}, {}", i, j);
println!("{} - {}", values[i], values[j]);
}
}
Run Code Online (Sandbox Code Playgroud)
总有一天,包含范围会稳定下来,你应该能够做到这样的事情(取决于最终的语法):
let early_indexes = lo...mid;
let late_indexes = (mid + 1)...hi;
for (i, j) in early_indexes.zip(late_indexes) {
println!("{}, {}", i, j);
println!("{} - {}", values[i], values[j]);
}
Run Code Online (Sandbox Code Playgroud)
如果您真的像我在示例中展示的那样迭代切片,您也可以直接组合两个迭代器并忽略索引:
let early_values = values[lo..(mid + 1)].iter();
let late_values = values[(mid + 1)..(hi + 1)].iter();
for (i, j) in early_values.zip(late_values) {
println!("{}, {}", i, j);
}
Run Code Online (Sandbox Code Playgroud)
变量
i不会增加 5,而是增加 1。
是的,一步一步增加很烦人,总有一天它也会稳定下来。同时:
如果您需要完全控制,您可以随时使用while或loop:
let mut i = 0;
while i < n {
if a[i] == ... {
i += 5;
}
i += 1;
}
Run Code Online (Sandbox Code Playgroud)