Collections 是否可以收集迭代器以向后填充集合?
是否可以收集迭代器,使其向后填充集合,例如在Collections 是否可以收集迭代器以向后填充集合?,collections,rust,iterator,Collections,Rust,Iterator,是否可以收集迭代器,使其向后填充集合,例如在向量中使用向前推 可以收集到一个Vec中,然后将其反转,但由于数据结构明确支持此功能,似乎不需要这样做。如果可能的话,我希望避免为循环编写显式的 是否可以收集迭代器以使其向后填充集合,例如在VecDeque中使用push_front 是的。您可以使用for_each对迭代器进行迭代,并按如下方式填充向量: 让mut my_deque:VecDeque=VecDeque::new(); (1..4).对于每个(| x | my|u deque.向前推(x
向量中使用向前推
可以收集到一个Vec
中,然后将其反转,但由于数据结构明确支持此功能,似乎不需要这样做。如果可能的话,我希望避免为
循环编写显式的
是否可以收集迭代器以使其向后填充集合,例如在VecDeque
中使用push_front
是的。您可以使用for_each
对迭代器进行迭代,并按如下方式填充向量:
让mut my_deque:VecDeque=VecDeque::new();
(1..4).对于每个(| x | my|u deque.向前推(x));
您可以使用该方法反转迭代器。之后,您可以调用for_each
以相反的顺序对其进行迭代,也可以直接将其收集到Vec
,因为它已被反转
fn main(){
让我的迭代器=vec![1,2,3]进入iter();
让reversed_iterator=my_iterator.rev();
反转的迭代器。对于每个({},x})的迭代器({},x));
}
或者更习惯地说,您可以在for
循环中直接反转它:
(1..4.rev()中的i的{
打印!(“{}”,i);
}
您的输出将是:
321
是的,有可能:
use std::collections::VecDeque;
fn main() {
let v: VecDeque<_> = (0..=2).collect_rev();
assert_eq!(v, [2, 1, 0]);
let v: Vec<_> = (0..=2).collect_rev();
assert_eq!(v, [2, 1, 0]);
}
使用std::collections::VecDeque;
fn main(){
设v:VecDeque=(0..=2).collect_rev();
断言(v[2,1,0]);
设v:Vec=(0..=2);
断言(v[2,1,0]);
}
您只需要一点胶水代码:
trait CollectRev: Iterator {
fn collect_rev<B>(self) -> B
where
B: FromIteratorRev<Self::Item>,
Self: Sized,
{
B::from_iter_rev(self)
}
}
impl<I: Iterator> CollectRev for I {}
trait FromIteratorRev<T> {
fn from_iter_rev(iter: impl IntoIterator<Item = T>) -> Self;
}
trait-collectorrev:Iterator{
fn收集版本(自)->B
哪里
B:Fromorrev,
自我:大小,
{
B::来自iter修订版(自我)
}
}
I{}的impl CollectRev
奥列夫的特点{
fn来自iter修订版(iter:impl INTO迭代器)->Self;
}
并针对各种类型有效地实施:
impl<T> FromIteratorRev<T> for VecDeque<T> {
fn from_iter_rev(iter: impl IntoIterator<Item = T>) -> Self {
let mut v = Self::new();
for i in iter {
v.push_front(i);
}
v
}
}
impl<T> FromIteratorRev<T> for Vec<T> {
fn from_iter_rev(iter: impl IntoIterator<Item = T>) -> Self {
let mut v: Self = iter.into_iter().collect();
v.reverse();
v
}
}
impl fromteratorrev for VecDeque{
fn来自iter修订版(iter:impl INTO迭代器)->Self{
让mut v=Self::new();
国际热核聚变实验堆{
v、 向前推(i);
}
v
}
}
针对Vec的impl FROMITERATOR REV{
fn来自iter修订版(iter:impl INTO迭代器)->Self{
让mut v:Self=iter.into_iter().collect();
v、 反向();
v
}
}
我希望避免为
循环编写显式的
必须有人编写代码。可以调用for_each
进行迭代,或者更惯用地说,在for
循环中使用它。从OP中直接解决这一点可能是值得的:向后填充集合,例如在向量中使用push_front
。对,用于循环。正如我所说,我希望避免这种情况。@Listeronepush\u front
是一种副作用,您希望应用于迭代器的每个元素。无论是for_each()
还是for
,都必须有一个调用它的循环。对于学习Rust或F#等混合范式语言的人来说,循环本质上是一件坏事,这是一个常见的误解。如果有像map
这样的函数可以更好地表达程序的语义,那么您应该使用它;但是,如果您真正要做的是“对集合中的每个元素执行一个副作用”,那么循环就没有什么问题。使用