【问题标题】:How to create an iterator that yields elements of a collection specified by a list of indices in Rust?如何创建一个迭代器,该迭代器产生由 Rust 中的索引列表指定的集合元素?
【发布时间】:2020-02-17 21:49:48
【问题描述】:

是否有一种简洁的方法可以使用给定的索引列表迭代向量?我有类似这样的代码:

fn main() {
    // Create a vector
    let v = vec![0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 7.8];

    // Create a series of indices
    let i = vec![3, 4, 2, 1];

    // Iterate over the elements in v in the order specified by each index in i
    for j in &i {
        println!("{}", v[*j]);
    }
}

我想对其进行修改,以便直接遍历v 中的元素,而不必遍历i 中的索引。基本上,看起来类似于for x in vs[i]

【问题讨论】:

  • 没有内置任何东西,但您可以创建自己的迭代器来完成它。
  • for j in i.iter().map(|&i| v[i]) {} 怎么样?

标签: rust iterator


【解决方案1】:

一种可能性:

i.iter().map(|idx| v[*idx])

如:

fn main() {
    // Create a vector
    let v = vec![0.1, 1.2, 2.3, 3.4, 4.5, 5.6, 7.8];

    // Create a series of indices
    let i = vec![3, 4, 2, 1];

    // Iterate over the elements in v in the order specified by i
    for j in i.iter().map(|idx| v[*idx]) {
        println!("{}", j);
    }
}

【讨论】:

  • 这绝对比定义适当迭代器的 60 行代码要好。它将索引的顺序反转为我认为的值,但效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2018-05-20
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多