【问题标题】:is it possible to filter on a vector in-place?是否可以就地过滤向量?
【发布时间】:2015-09-03 23:24:26
【问题描述】:

我想从Vec 中删除一些元素,但vec.iter().filter().collect() 使用借来的项目创建了一个新向量。

我想在不分配额外内存的情况下改变原始 Vec(并保留已删除元素的内存作为向量的额外容量)。

【问题讨论】:

    标签: iterator rust


    【解决方案1】:

    如果要移除元素,可以使用retain(),如果闭包返回false,它会从向量中移除元素:

    let mut vec = vec![1, 2, 3, 4];
    vec.retain(|&x| x % 2 == 0);
    assert_eq!(vec, [2, 4]);
    

    如果你想修改元素,你必须在for x in vec.iter_mut()中进行。

    【讨论】:

      【解决方案2】:

      如果你真的想在过滤向量的同时改变向量的元素,你可以使用夜间专用方法Vec::drain_filter,这是一个非常灵活的工具:

      #![feature(drain_filter)]
      
      fn main() {
          let mut vec = vec![1, 2, 3, 4];
          vec.drain_filter(|x| {
              if *x % 2 == 0 {
                  true
              } else {
                  *x += 100;
                  false
              }
          });
          assert_eq!(vec, [101, 103]);
      }
      

      它还允许你获取被移除的元素,因为整个方法的返回值是一个迭代器!

      【讨论】:

        猜你喜欢
        • 2021-06-23
        • 2013-07-27
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2021-12-15
        • 1970-01-01
        相关资源
        最近更新 更多