vector - 有效保留一系列vec元素

标签 vector rust

我想要这样的方法:

trait RetainRange {
  fn retain_range(&mut self, range: std::ops::Range<usize>);
}

impl<T> RetainRange for Vec<T> {
  fn retain_range(&mut self, range: std::ops::Range<usize>) {
    // Retain only the elements within the given range.
    let mut i = 0usize;
    self.retain(|el| {
      let r = range.contains(&i);
      i += 1;
      r
    });
  }
}
但是每次都调用lambda和range.contains()似乎效率很低。有没有更好的办法?

最佳答案

此代码生成看起来更有效的汇编。

  fn retain_range(&mut self, range: std::ops::Range<usize>) {
    self.truncate(range.end);
    if range.start < self.len() {
      self.drain(0..range.start);
    } else {
      self.clear();
    }
  }
如果范围超出了if range.start < self.len()的末尾,则添加Vec检查可以避免出现 panic ,并且实际上还可以提高汇编性。

关于vector - 有效保留一系列vec元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65004178/

相关文章:

C++数据结构代替数据库

c++ - 使用 deque 实例化 priority_queue 无法编译 - 使用 vector 则可以。这是为什么?

c++ - std::vector 是否需要使用移动而不是复制?

arrays - 如何在AS3中制作2D矢量

rust - 将 Cargo 与自定义链接器一起使用

c++ - 从哑指针 vector 切换到 boost::shared_ptr 时出现问题

rust - 迭代 Rust 中的命名正则表达式组

import - 包括一个内部模块产生 "maybe a missing crate ` 模块 2`"

rust - 函数数组类型的 `fn` 和 `||` 之间的差异

rust - 可选功能 `uuid` 需要列 #1 ("id"的 UUID 类型)