gpt4 book ai didi

vector - 消耗向量的 Vec::chunks() 的替代方法

转载 作者:行者123 更新时间:2023-11-29 08:08:45 26 4
gpt4 key购买 nike

我有以下函数,它接受一个向量作为参数并返回它的元素对的向量:

fn to_pairs(flat: Vec<u64>) -> Vec<(u64, u64)> {
assert!(flat.len() % 2 == 0);
let mut pairs = Vec::new();
pairs.reserve(flat.len() / 2);
for pair in flat.chunks(2) {
assert!(pair.len() == 2);
pairs.push((pair.get(0).unwrap().clone(), pair.get(1).unwrap().clone()));
}
pairs
}

我想使用向量flat,这样我就不必在构造对时克隆它的元素。是否可以在不重新实现 Vec::chunks() 我自己的变体的情况下这样做?

最佳答案

I want consume the vector flat so I don't have to clone its elements when constructing the pair.

将输入的Vec转换成一个迭代器,然后一次从迭代器中取出两个东西。本质上,您想要与 processing a Range (an iterator) in chunks 相同的东西:

fn to_pairs<T>(flat: Vec<T>) -> Vec<(T, T)> {
let len = flat.len();

assert!(len % 2 == 0);
let mut pairs = Vec::with_capacity(len / 2);

let mut input = flat.into_iter().peekable();

while input.peek().is_some() {
match (input.next(), input.next()) {
(Some(a), Some(b)) => pairs.push((a, b)),
_ => unreachable!("Cannot have an odd number of values"),
}
}

pairs
}

fn main() {
assert_eq!(vec![(1,2), (3,4)], to_pairs(vec![1,2,3,4]));
assert_eq!(vec![(true,true), (false,false)], to_pairs(vec![true,true,false,false]));
}

assert!(len % 2 == 0); 在这里非常重要,因为 Iterator 不保证之后会发生什么第一次 next 返回 None。由于我们调用 next 两次而不检查第一个值,我们可能会触发这种情况。在其他情况下,您需要使用 fuse .

作为pointed out by Kha ,您可以稍微简化 while 循环:

let mut input = flat.into_iter();

while let (Some(a), Some(b)) = (input.next(), input.next()) {
pairs.push((a, b));
}

关于vector - 消耗向量的 Vec::chunks() 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37097395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com