rust vector创建与修改

1.可以用rust核心库自带的new函数 (在prelude中,无需import)

let v:  Vec<i32> = Vec::new();

2.用vec!宏创建

let v = vec![1, 2, 3];
或者
let v = vec![0xFF; 3];

3.更新

v.push(5);
v.push(6);
v.push(7);
v.push(8);

4. 从 slice中复制

let b &[u8] = b"softs.im";
v.copy_from_slice(b);

copy_from_slice(&mut self, src: &[T])
速度很快,如果类型实现了Copy trait, 就会用memcpy复制元素。
如果没有实现,就是用 cloent_from_slice
此函数 要求src和self的长度一样

5. 替换元素

    
	let mut v: Vec = vec![0xFF; 8];

	let b: &[u8] = b"softs.im";
	v.copy_from_slice(b);

        println!("v = {:?}", v);

6. 对于Vec<u8> 写入byte array, 是追加,不是覆盖。容量会自动增加

 
write(&mut self, buf: &[u8]) -> Result<usize> 
write_all(&mut self, buf: &[u8]) --> Result<()>

7. 对于Vec<u8> , 还可以从String来创建

from(string: String) -> Vec<u8, Global>
from(s: &str) -> Vec<u8, Global>

8. 填充

let mut buf = vec![0; 10];
buf.fill(1);
assert_eq!(buf, vec![1; 10]);

9. 用map zip进行复制

let a = [1, 2, 3, 4, 5];
let slice = &a[1..4];
let mut x: Vec<u8> = vec![0; 3];
println!("X at startup: {:?}", x);    
slice.iter().zip(x.iter_mut()).map(|(&t, p)| *p = t).count();
println!("X copied from vec: {:?}", x);

不用map, 可写成

    for (&t, p) in slice.iter().zip(x.iter_mut()) {
        *p = t;
    }

10. 用 try_into()

11. 部分复制: 把buffer复制到memory偏移地址STARTING_PROGRAM_ADDRESS处

用枚举, 可以得到index
for (index, byte) in buffer.iter().enumerate() {
    memory[STARTING_PROGRAM_ADDRESS + index] = *byte;
}
用copy_from_slice
memory[STARTING_PROGRAM_ADDRESS..(STARTING_PROGRAM_ADDRESS + buffer.len())]
    .copy_from_slice(buffer.as_slice());
或
memory[STARTING_PROGRAM_ADDRESS..][..buffer.len()]
    .copy_from_slice(&buffer);

用zip
for (src, dst) in buffer.iter().zip(memory.iter_mut().skip(STARTING_PROGRAM_ADDRESS)) {
    *dst = *src;
}
或
for (src, dst) in buffer.iter().zip(&mut memory[STARTING_PROGRAM_ADDRESS..]){
    *dst = *src;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注