use std::slice::Iter;
use std::iter::Iterator;
// 数组构造
let it = [1,2,3,4].iter();
// 向量构造
let it = vec![5; 3].iter();
// 可修改构造
let it = vec![5; 3].iter_mut();
合并
// chain()将两个迭代器顺序拼接合并,后续有例子,可拼接成无限多个
let it = (0..10).chain(20..30);
// 0~9~20~29
元组生成
zip() 将2个迭代器合并为一对一元组迭代器
let it = [1,3,5].iter().zip([2,4,6].iter());
assert_eq!(vec![(&1,&2),(&3,&4),(&5,&6)], it.collect::<Vec<(,)>>());
assert_eq!(vec![(0,'f'),(1,'o'),(2,'o')], (0..).zip("foo".chars()).collect::<Vec<_>>());
// 计算2个等长字符串中相同位置上字符不同的个数
let s1 = "amily";
let s2 = "emily";
let diff = s1.chars().zip(s2.chars()).filter(|x|x.0 != x.1).count();
println!("{diff}");//1
案例
let a = [1,2,3].iter();
let b = ['a', 'b', 'c', 'd'].iter();
let x = a.zip(b);
//(1, 'a')(2, 'b')(3, 'c'),会忽略 'd'
for c in x {
print!("{:?}", c);
}
// 如果三个合并
let a = [1, 2, 3].iter();
let b = ['a', 'b', 'c', 'd'].iter();
let c = [1, 2, 3].iter();
let x = a.zip(b).zip(c);
//(1, ('a', 1))(2, ('b', 2))(3, ('c', 3))
for c in x {
print!("{:?}", c);
}
遍历
while-next 模式
let mut iter = [1,2,3,4,5].iter();
// 输出:1 2 3 4 5
// Some(x) 不为空就一直循环
while let Some(x) = iter.next() {
print!("{:?} ", x);
}
for-in 模式
let it = 0..10;//[0,9]
// for-in循环对迭代器进行遍历
for i in it {
print!("{} ", i);
}
// 无限循环
for i in 0..{
}
let full_slice: &[i32] = &nums1[..];
println!("{:?}", full_slice);// 完整切片
// 对切片类型,还可以进行切片
println!("{:?}", &full_slice[1..3]);// [2,3]
println!("{:?}", &&nums1[0..4][1..3]);// [2,3]
println!("{:?}", &nums1[0..2]);// [1,2]
println!("{:?}", &nums1[2..]);// [3,4,5,6]
println!("{:?}", &nums1[1..nums1.len()-1]);// [2,3,4,5]
let x = [1, 2, 3, 4, 5, 6];
let y = &x[0..3];
println!("{:?}", y);//[1, 2, 3]
let y = &x[0..=3];
println!("{:?}", y);//[1, 2, 3, 4]
//b开头的字符串,在编译器看来就是u8数组的引用
let x: &[u8; 11] = b"Hello World";
for c in x {
// c是&u8类型,即u8的引用类型
// 这里将c解引用后的u8类型转为char类型
print!("{} ", *c as char);
}
println!();
// u8数组的切片
let x_slice1 = &x[0..2];
println!("{:?}", x_slice1);//[72, 101]
遍历数组
// 1.
for i in 0..nums1.len() {
println!("{} ", nums1[i]);
}
// 2.
for (pos, v) in nums1.iter().enumerate() {
println!("nums[{}]={}", pos, v);
}
// 3.
for num in nums1 {
print!("{} ", num);
}
下一个元素
next() 可多次调用,一次取出一个值,直至返回None。调用一次,迭代里中就会少一个元素。
// next()方法取得迭代器中下一个元素
let mut it = 1..3;
assert_eq!(Some(1), it.next());
assert_eq!(Some(2), it.next());
assert_eq!(None, it.next());