gpt4 book ai didi

reference - 将元组引用的迭代器解压缩到两个引用集合中

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

我有一个 Iterator<Item = &(T, U)>在一片上 &[(T, U)] .我想将这个迭代器解压缩到它的组件中(即获取 (Vec<&T>, Vec<&U>) )。

Rust 通过 .unzip() 提供解压缩功能Interator 上的方法:

points.iter().unzip()

不幸的是,这不能按原样工作,因为 .unzip()期望迭代器项的类型是一个元组;我的是对元组的引用。

为了解决这个问题,我尝试编写一个函数,在元组引用和引用元组之间进行转换:

fn distribute_ref<'a, T, U>(x: &'a (T, U)) -> (&'a T, &'a U) {
(&x.0, &x.1)
}

然后我可以map在生成的迭代器上得到一些东西 .unzip()可以处理:

points.iter().map(distribute_ref).unzip()

这现在有效,但我觉得有点奇怪。特别是,distribute_ref看起来像是 Rust 标准库提供的相当简单的操作。我猜它要么是但我找不到它,要么我没有以正确的方式处理它。

有更好的方法吗?

最佳答案

Is there a better way to do this?

“更好”有点主观。你可以让你的功能更短:

fn distribute_ref<T, U>(x: &(T, U)) -> (&T, &U) {
(&x.0, &x.1)
}

Lifetime elision在这种情况下允许省略生命周期注释。

您可以使用闭包来做同样的事情:

points.iter().map(|&(ref a, ref b)| (a, b)).unzip()

根据任务的不同,克隆数据就足够了。特别是在这种情况下,因为对 u8 的引用比 u8 本身占用的空间多 4 或 8 倍。

points().iter().cloned().unzip()

关于reference - 将元组引用的迭代器解压缩到两个引用集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49093090/

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