打赏

[易学易懂系列|rustlang语言|零基础|快速入门|(10)|Vectors容器]

[易学易懂系列|rustlang语言|零基础|快速入门|(10)]

有意思的基础知识

Vectors

我们之前知道array数组是定长,只可我保存相同类型的数据的数据类型。

如果,我们想用不定长的数组呢?因为很多时候,数据有可能是或多或少,不确定个数的。

这时候,vector就出场了。

在Rust,vecotr是可变长度的数组,用于保存相同类型的数据。

vector是引用类型,其数据也是动态地在堆heap分配内存空间。

我们知道String类型,是引用类型。

其实,String底层,也就是用vector来保存字符串的数据的。

一般来说,vector在Rust里有三个主要部分:

1.指向数据(堆heap内存)的地址指针

2.当前成员数据的长度( length )。

3.容量( Capacity )。

vecotr定义的格式为:

Vec 其中T为泛型。

我们来看看示例代码:

构建一个空的vector

let mut a = Vec::new(); //1.With new() keyword
let mut b = vec![]; //2.Using the vec! macro

我们看到rust有两种构建vector的方法:

1.用new()关键词

2.用宏vec!(什么是宏,我们以后会讲到)

构建一个包含类型的vector:

let mut a2: Vec<i32> = Vec::new();
let mut b2: Vec<i32> = vec![];
let mut b3 = vec![1i32, 2, 3];//Sufixing 1st value with data type

let mut b4 = vec![1, 2, 3];
let mut b5: Vec<i32> = vec![1, 2, 3];
let mut b6  = vec![1i32, 2, 3];
let mut b7 = vec![0; 10]; //Ten zeroes

访问并更新数据:

//Accessing and changing existing data
let mut c = vec![5, 4, 3, 2, 1];
c[0] = 1;
c[1] = 2;
//c[6] = 2; Cannot assign values this way, index out of bounds
println!("{:?}", c); //[1, 2, 3, 2, 1]

//push and pop
let mut d: Vec<i32> = Vec::new();
d.push(1); //[1] : Add an element to the end
d.push(2); //[1, 2]
d.pop(); //[1] : : Remove an element from the end


// 🔎 Capacity and reallocation
let mut e: Vec<i32> = Vec::with_capacity(10);
println!("Length: {}, Capacity : {}", e.len(), e.capacity()); //Length: 0, Capacity : 10

// These are all done without reallocating...
for i in 0..10 {
    e.push(i);
}
// ...but this may make the vector reallocate
e.push(11);

如果要访问vector里的数据,迭代代码如下:

let mut v = vec![1, 2, 3, 4, 5];

for i in &v {
    println!("A reference to {}", i);
}

for i in &mut v {
    println!("A mutable reference to {}", i);
}

for i in v {
    println!("Take ownership of the vector and its element {}", i);
}

以上,希望对你有用。

如果遇到什么问题,欢迎加入:rust新手群,在这里我可以提供一些简单的帮助,加微信:360369487,注明:博客园+rust

参考文章: https://learning-rust.github.io/docs/b1.vectors.html

posted @ 2019-11-29 19:56  gyc567  阅读(355)  评论(0编辑  收藏  举报