gpt4 book ai didi

collections - 扩展 VecDeque 以限制大小

转载 作者:行者123 更新时间:2023-12-03 11:29:43 26 4
gpt4 key购买 nike

我想实现一个具有最大大小限制的 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 中的每个函数克隆/导出到 LimVecDeque。很多工作!
第二种方法:为 VecDeque 创建一个新特征并实现:
trait Limited {
type Elem;

pub fn push_bounded(&self, limit: usize, elem: Elem);
}
然后用 VecDeque 实现这个特征。
但是我必须通过 limit每次插入的值。一次怎么能通过极限值?
一般来说,从std向结构添加功能的简单方法是什么(不丢失/隐藏当前功能)?

最佳答案

正如 edkeveked 的回答所指出的,有一个可用的 crate ( BoundedVecDequeue ),它实现了您尝试实现的确切情况。
如果你看一下 BoundedVecDequeue 的实现您将看到它使用您描述的第一个模式:在需要修改包装类型的行为的地方创建包装方法,并在不需要的地方委托(delegate)方法调用。
正如您所指出的,这可能会导致大量样板文件。为了减少所涉及的工作量,您不妨试试 delegate crate,它添加了一个为您执行委托(delegate)的宏:

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
}
}

// ...

}
警告:我自己还没有真正使用过这个箱子,所以我不能保证它的质量。

关于collections - 扩展 VecDeque 以限制大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64077048/

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