如何创建一个大小有限的VecDeque?

2024-01-27

我想实施一个VecDeque有最大尺寸限制。我有两个策略,但我都无法完成。

第一种方法:通过组合继承。

我创建了一个新结构:

pub struct LimVecDeque<T> {                                                                                                    
     deque: VecDeque<T>,                                                 
     limit: usize,                                                       
}

并创建一个新的推送函数:

impl<T> LimVecDeque<T> {
  ...

  pub fn push (&self, elem: T) {
    self.deque.push_back(elem);
    if self.limit < self.deque.len() {
      self.deque.pop_front();
    }
  }

  ...
}

这是可行的,但是随着我的程序的成长,我需要向我的程序添加功能LimVecDeque结构。大部分都是原作的复制品VecDeque:

pub fn len(&self) -> usize {
  self.deque.len()
}

我还有更多问题需要导出VecDeque::iter()。我在类型和迭代器方面遇到了问题(我还不太擅长迭代器)。 这种方法迫使我克隆/导出每个函数VecDeque into LimVecDeque。大量的工作!

第二种方法:创建一个新特征并实施VecDeque:

trait Limited {
  type Elem;

  pub fn push_bounded(&self, limit: usize, elem: Elem);
}

然后再实现该特征VecDeque.

但我必须通过limit每次插入的值。怎样才能一次超过极限值呢?

一般来说,从 std 向结构添加功能(不丢失/隐藏当前功能)的简单方法是什么?


正如 edkeveked 的回答所指出的,有一个可用的板条箱(BoundedVecDequeue https://docs.rs/bounded-vec-deque/0.1.0/bounded_vec_deque/struct.BoundedVecDeque.html),它实现了您正在尝试实现的确切情况。

如果你看一下实施BoundedVecDequeue您将看到它使用您描述的第一个模式:在需要修改包装类型的行为的地方创建包装器方法,并在不需要修改包装类型的地方委托方法调用。

正如您所指出的,这可能会导致大量样板文件。为了减少所涉及的工作量,您可能想尝试delegate https://docs.rs/delegate/0.4.3/delegate/crate,它添加了一个为您执行委派的宏:

use delegate::delegate;

impl<T> LimVecDeque<T> {
    delegate! {
        to self.inner {

            pub fn len(&self) -> usize;
            pub fn truncate(&mut self, new_len: usize);
            pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]);
            // etc
        }
    }

    // ...

}

警告:我自己还没有实际使用过这个板条箱,所以我不能保证它的质量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建一个大小有限的VecDeque? 的相关文章

随机推荐