矢量矢量创建与vec!宏包含不同的容量
发布时间:2020-12-14 05:15:31 所属栏目:Java 来源:网络整理
导读:我有一个vectormatrix_a,它包含3个向量,并用vec初始化!宏. 由于Vec :: with_capacity(dim),每个向量应该具有3的容量,但只有最后一个向量的容量为3.其他向量的容量为0. 有人可以解释为什么吗? fn main() { let dim = 3; let matrix_a: VecVeci32 = vec![Vec
我有一个vectormatrix_a,它包含3个向量,并用vec初始化!宏.
由于Vec :: with_capacity(dim),每个向量应该具有3的容量,但只有最后一个向量的容量为3.其他向量的容量为0. 有人可以解释为什么吗? fn main() { let dim = 3; let matrix_a: Vec<Vec<i32>> = vec![Vec::with_capacity(dim); dim]; for vector in matrix_a{ println!("Capacity of vector: {}",vector.capacity()); } } 输出: Capacity of vector: 0 Capacity of vector: 0 Capacity of vector: 3 解决方法
根据
documentation,vec!定义为:
macro_rules! vec { ( $elem : expr ; $n : expr ) => ( $crate:: vec:: from_elem ( $elem,$n ) ); ( $( $x : expr ),* ) => ( < [ _ ] > :: into_vec ( $crate:: boxed:: Box:: new ( [ $( $x ),* ] ) ) ); ( $( $x : expr,) * ) => ( vec ! [ $( $x ),* ] ) } 在你的情况下,这意味着: vec![Vec::with_capacity(dim); dim] 扩展到: std::vec::from_elem(Vec::with_capacity(dim),dim) Vec :: from_elem的定义隐藏在文档中,但可以是found in the source: pub fn from_elem<T: Clone>(elem: T,n: usize) -> Vec<T> { unsafe { let mut v = Vec::with_capacity(n); let mut ptr = v.as_mut_ptr(); // Write all elements except the last one for i in 1..n { ptr::write(ptr,Clone::clone(&elem)); ptr = ptr.offset(1); v.set_len(i); // Increment the length in every step in case Clone::clone() panics } if n > 0 { // We can write the last element directly without cloning needlessly ptr::write(ptr,elem); v.set_len(n); } v } } 而这个神秘之心解决了: >元素被克隆n – 1次,对于矢量的n-1个第一个元素,然后移动到第n个时隙. 因此,您获得的结果与预期完全一致,如果不是预期的话. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |