[易学易懂系列|rustlang语言|零基础|快速入门|(10)]
有意思的基础知识
Vectors
我们之前知道array数组是定长,只可我保存相同类型的数据的数据类型。
如果,我们想用不定长的数组呢?因为很多时候,数据有可能是或多或少,不确定个数的。
这时候,vector就出场了。
在Rust,vecotr是可变长度的数组,用于保存相同类型的数据。
vector是引用类型,其数据也是动态地在堆heap分配内存空间。
我们知道String类型,是引用类型。
其实,String底层,也就是用vector来保存字符串的数据的。
一般来说,vector在Rust里有三个主要部分:
1.指向数据(堆heap内存)的地址指针
2.当前成员数据的长度( length )。
3.容量( Capacity )。
vecotr定义的格式为:
Vec
其中T为泛型。
我们来看看示例代码:
构建一个空的vector
1
2
3 1let mut a = Vec::new(); //1.With new() keyword
2let mut b = vec![]; //2.Using the vec! macro
3
我们看到rust有两种构建vector的方法:
1.用new()关键词
2.用宏vec!(什么是宏,我们以后会讲到)
构建一个包含类型的vector:
1
2
3
4
5
6
7
8
9 1let mut a2: Vec<i32> = Vec::new();
2let mut b2: Vec<i32> = vec![];
3let mut b3 = vec![1i32, 2, 3];//Sufixing 1st value with data type
4
5let mut b4 = vec![1, 2, 3];
6let mut b5: Vec<i32> = vec![1, 2, 3];
7let mut b6 = vec![1i32, 2, 3];
8let mut b7 = vec![0; 10]; //Ten zeroes
9
访问并更新数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 1//Accessing and changing existing data
2let mut c = vec![5, 4, 3, 2, 1];
3c[0] = 1;
4c[1] = 2;
5//c[6] = 2; Cannot assign values this way, index out of bounds
6println!("{:?}", c); //[1, 2, 3, 2, 1]
7
8//push and pop
9let mut d: Vec<i32> = Vec::new();
10d.push(1); //[1] : Add an element to the end
11d.push(2); //[1, 2]
12d.pop(); //[1] : : Remove an element from the end
13
14
15// ? Capacity and reallocation
16let mut e: Vec<i32> = Vec::with_capacity(10);
17println!("Length: {}, Capacity : {}", e.len(), e.capacity()); //Length: 0, Capacity : 10
18
19// These are all done without reallocating...
20for i in 0..10 {
21 e.push(i);
22}
23// ...but this may make the vector reallocate
24e.push(11);
25
如果要访问vector里的数据,迭代代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1let mut v = vec![1, 2, 3, 4, 5];
2
3for i in &v {
4 println!("A reference to {}", i);
5}
6
7for i in &mut v {
8 println!("A mutable reference to {}", i);
9}
10
11for i in v {
12 println!("Take ownership of the vector and its element {}", i);
13}
14
以上,希望对你有用。
1
2 1如果遇到什么问题,欢迎加入:rust新手群,在这里我可以提供一些简单的帮助,加微信:360369487,注明:博客园+rust
2