impl push(self , item : T) 用于具有 2 Vecs<T> 的结构
impl push(self , item : T) for a struct with 2 Vecs<T>
我一直在尝试推动这个结构:
struct StackMin<T: std::cmp::Ord>
{
stack : Vec<T>,
min : Vec<T>
}
像这样:
fn push(&mut self, item: T) {
let l = self.stack.len();
let x: T;
match l {
0 => println!("There is nothing in the stack."),
n => {
if item <= self.stack[l - 1] {
self.stack.push(item); //item moved here
self.min.push(item); // so I can't use it again here
} else {
self.stack.push(item);
}
}
}
}
问题是项目随第一个 Vec<T>::push
一起移动,所以我无法在第二次调用 push() 时立即使用它。我考虑过创建一个变量 let a = &item
并在第二次调用中使用它,但是推送需要“T”而不是“&T”。
此外,如果我尝试执行 a=self.stack[l-1]
,这是一个错误,因为 T
类型没有 Copy
/Clone
特征。
后期编辑:我还需要打印最小向量中的最后一个值。但是它没有 std::fmt::Display ,我不认为它可以实现!?有什么想法吗?
你会如何处理这个问题?
假设您可以更改结构 StackMin
的内部值,但不能更改特征要求,您可以这样做:
struct MinStack<T: std::cmp::Ord> {
// T is the data you want to store
// and usize points to the smallest T
inner: Vec<(T, usize)>
}
impl<T: std::cmp::Ord> MinStack<T> {
fn push(&mut self, val: T) {
let min_index = self.inner.last()
// get last min value and its index
.map(|(_, index)| (&self.inner[*index].0, index))
// check if it is smaller then the current value
.and_then(|(prev_min, min_index)|
(prev_min < &val).then(|| *min_index)
)
// if not smaller or does not exist
// set it to the current index
.unwrap_or(self.inner.len());
self.inner.push((val, min_index));
}
}
这是 MinStack 挑战的完整实现 Rust Playground。
如果我应该在上面的代码中澄清一些事情,请告诉我。
所用方法的文档:
我一直在尝试推动这个结构:
struct StackMin<T: std::cmp::Ord>
{
stack : Vec<T>,
min : Vec<T>
}
像这样:
fn push(&mut self, item: T) {
let l = self.stack.len();
let x: T;
match l {
0 => println!("There is nothing in the stack."),
n => {
if item <= self.stack[l - 1] {
self.stack.push(item); //item moved here
self.min.push(item); // so I can't use it again here
} else {
self.stack.push(item);
}
}
}
}
问题是项目随第一个 Vec<T>::push
一起移动,所以我无法在第二次调用 push() 时立即使用它。我考虑过创建一个变量 let a = &item
并在第二次调用中使用它,但是推送需要“T”而不是“&T”。
此外,如果我尝试执行 a=self.stack[l-1]
,这是一个错误,因为 T
类型没有 Copy
/Clone
特征。
后期编辑:我还需要打印最小向量中的最后一个值。但是它没有 std::fmt::Display ,我不认为它可以实现!?有什么想法吗?
你会如何处理这个问题?
假设您可以更改结构 StackMin
的内部值,但不能更改特征要求,您可以这样做:
struct MinStack<T: std::cmp::Ord> {
// T is the data you want to store
// and usize points to the smallest T
inner: Vec<(T, usize)>
}
impl<T: std::cmp::Ord> MinStack<T> {
fn push(&mut self, val: T) {
let min_index = self.inner.last()
// get last min value and its index
.map(|(_, index)| (&self.inner[*index].0, index))
// check if it is smaller then the current value
.and_then(|(prev_min, min_index)|
(prev_min < &val).then(|| *min_index)
)
// if not smaller or does not exist
// set it to the current index
.unwrap_or(self.inner.len());
self.inner.push((val, min_index));
}
}
这是 MinStack 挑战的完整实现 Rust Playground。
如果我应该在上面的代码中澄清一些事情,请告诉我。
所用方法的文档: