Vector 如何反向填充向量?

Vector 如何反向填充向量?,vector,rust,indexoutofboundsexception,populate,Vector,Rust,Indexoutofboundsexception,Populate,我有一个向量: let v = Vec<T>::with_capacity(10); 不幸的是,这种恐慌;当使用Vec::with_capacity进行分配时,向量的实际初始长度仍然是0 我如何才能最好地完成这一点?如果我没有T的构造函数怎么办 如何反向填充向量 您可以通过以下方式完成: 使用std::collections::VecDeque; fn main(){ 让mut v=VecDeque::new(); 因为我在0..5{ v、 向前推(i); } 第五项{ 打印!(“

我有一个向量:

let v = Vec<T>::with_capacity(10);
不幸的是,这种恐慌;当使用
Vec::with_capacity
进行分配时,向量的实际初始长度仍然是
0

我如何才能最好地完成这一点?如果我没有
T
的构造函数怎么办

如何反向填充向量

您可以通过以下方式完成:

使用std::collections::VecDeque;
fn main(){
让mut v=VecDeque::new();
因为我在0..5{
v、 向前推(i);
}
第五项{
打印!(“{}”,项目);
}
}


使用数组和迭代器可以解决此问题,而不是使用
VecDeque

  • 声明包含选项类型的数组
  • 使用索引设置数组单元格
  • 迭代数组
  • 过滤数组以消除
    None
  • 映射展开的值
  • 把它们收集成向量
fn main(){
设mut v=[None;10];
设muti=5i32;
当i>0时{
i-=1;
v[i as usize]=Some(4i32-i);
}
让反向_填充:Vec=v
.国际热核实验堆(iter)
.filter(|x | x.is_some())
.map(| x | x.unwrap())
.收集();
对于反向填充的项目{
打印!(“{:?}”,项目);
}
}


两个输出都将是:
43210


似乎相关,但答案可能不是很吸引人。您可以像这样初始化vec
[0;10]。对于_vec()
@ÖmerErden,它不是
{integer}
,但是,我没有访问构造函数的权限。@E_net4theabusedownvoter再次,您已经找到了重复的目标。如果有类似于
reverse\u collect
的东西会很好。但是接下来我必须将其转换为
Vec
。因为Vec实现了从trait for VecDeque,您可以很容易地将其转换为Vec。但是如果我正在这样做,我不能向前填充向量,然后将其反转吗?为什么需要更多内存分配的情况会更好?将
VecDeque
转换为
Vec
不会导致任何新的分配。它们都在内部保存RawVec,这个缓冲区从一个缓冲区传递到另一个缓冲区。根据
VecDeque
的当前状态,可能需要对元素重新排序,这可以通过调用
ptr::copy
来完成。这可能比颠倒元素的顺序(几个大的memcpy与多个小的memcpy)要快。当然,将元素直接写到它们的最终位置是最好的。
let i = 10;
while i > 0 {
    i -= 1;
    v[i] = non_pure_function(i);
}