如何为类型 T 的向量中的元素分配 space?
How do I allocate space for elements in vector for type T?
fn test<T>(arr: &mut [T]) {
let vector=vec![] //what can I do here so that I have vector as vec with same size as arr and of type T.
}
fn main() {
let xs = vec![1, 2, 3, 4, 5, 6];
test(&mut xs);
}
如果我强制T具有默认特征,有什么解决方案吗?
我应该能够随机访问创建的向量,而不是串行推送。
使用with_capacity
方法
fn test<T>(arr: &mut [T]) {
let vector : Vec<T> = Vec::with_capacity(arr.len());
...
}
注意它不分配元素,它只是使底层缓冲区足够大以容纳 N
个元素而无需额外的 re-allocations.
I should be able to randomly access the created vector, not push serially"
如果元素是 Clone
,另一种分配元素的简单方法是简单地使用 vec!
宏:
fn test<T: Clone>(arr: &mut [T], item: T) {
let vector : Vec<T> = vec![item; arr.len()];
...
}
有几种方法可以做到这一点。如果你可以强制执行 T: Default
你可以使用 resize_with
fn test<T: Default>(arr: &mut [T]) {
let v: Vec<T> = Vec::new();
v.resize_with(arr.len(), Default::default);
}
否则,您可以强制执行 T: Clone
并使用 resize
并为元素提供初始值:
fn test<T: Clone>(arr: &mut [T], initial: T) {
let v: Vec<T> = Vec::new();
v.resize(arr.len(), initial);
}
vec
宏可以接受two-arguments形式,其中第一个是将重复的元素,第二个是重复元素的数量。
看起来像这样:
fn test<T: Clone+Default>(arr: &mut [T]) {
let vector = vec![T::default(); arr.len()];
}
fn test<T>(arr: &mut [T]) {
let vector=vec![] //what can I do here so that I have vector as vec with same size as arr and of type T.
}
fn main() {
let xs = vec![1, 2, 3, 4, 5, 6];
test(&mut xs);
}
如果我强制T具有默认特征,有什么解决方案吗? 我应该能够随机访问创建的向量,而不是串行推送。
使用with_capacity
方法
fn test<T>(arr: &mut [T]) {
let vector : Vec<T> = Vec::with_capacity(arr.len());
...
}
注意它不分配元素,它只是使底层缓冲区足够大以容纳 N
个元素而无需额外的 re-allocations.
I should be able to randomly access the created vector, not push serially"
如果元素是 Clone
,另一种分配元素的简单方法是简单地使用 vec!
宏:
fn test<T: Clone>(arr: &mut [T], item: T) {
let vector : Vec<T> = vec![item; arr.len()];
...
}
有几种方法可以做到这一点。如果你可以强制执行 T: Default
你可以使用 resize_with
fn test<T: Default>(arr: &mut [T]) {
let v: Vec<T> = Vec::new();
v.resize_with(arr.len(), Default::default);
}
否则,您可以强制执行 T: Clone
并使用 resize
并为元素提供初始值:
fn test<T: Clone>(arr: &mut [T], initial: T) {
let v: Vec<T> = Vec::new();
v.resize(arr.len(), initial);
}
vec
宏可以接受two-arguments形式,其中第一个是将重复的元素,第二个是重复元素的数量。
看起来像这样:
fn test<T: Clone+Default>(arr: &mut [T]) {
let vector = vec![T::default(); arr.len()];
}