rust的标准库中包含了一组常用的集合类,可以将大量数据放在集合中.与内置的 arraytuple 不同,标准库中的集合类都可以增长和裁剪.

在本章中介绍三种集合类:

  • vector : 顺序存放一组数据
  • String: 字符串类
  • hash map: hash map 是通用map类的一种特殊实现,将每个值关联一个特定值.

8.1 vector

vector的类型是 Vec<>,是一个泛型,在编译时必须能够确定类型.确定类型可以使用变量的类型声明,也可以由编译器推断.

let v : Vec<i32> = Vec::new(); // v是 Vec<i32>类型

let v = Vec![1,2,3];  // v是Vec<i32>类型

let mut v = Vec::new();  // 由下面的push可以推断v是 `Vec<i32>`类型
v.push(1);

8.1.1 遍历

let v = Vec![1,2,3];
for n_ref in &v {
	println!("{}", *n_ref);
}

let mut v = Vec![1, 2, 3];
for n_ref in &mut v {
	*n_ref += 1;
}

遍历时,遍历对象要传入引用.遍历器是一个指针,使用时需要解引用.

之前就讨论过 vector的权限,与成员的权限是关联的,所以在迭代时,不能再对vector进行添加删除操作.

8.2 字符串

Rust内置了字符串切片 &str ,在标准库中实现了 String字符串类型.

新建字符串:

let str = String::new();

let str = "Hello".to_string();

let str = String::from("Hello");

let str = format!("Hello {}", "World");

8.2.1 注意字符串修改

可以使用+push_str 来连接字符串,也可以使用 format! 宏.

需要注意 + 方法会移除第一个参数的权限,第2个参数需要传引用.

let x = "Hello";
let y = " ";
let z = "World";

let s = x + &y;  // x已经被夺权,后面不能再使用了

s.push_str(z);   // s和y, z 都可以继续使用.

8.2.2 索引和遍历

字符串不能使用索引来取值,因为字符串是 Unicode字符,其成员不一定是单字节的. [index] 是禁用的,但可以切片 [s, e].

可以使用 chars函数来获取字符列表,使用bytes函数来获取byte列表.注意他们长度不一定相同.

8.3 HashMap

HaspMap 是一个map,跟其他语言中的 map 概念上是一样的。

// 定义一个 string->int 的map
let mut m : HashMap<string, i32> = HashMap::new(); 

// 定义一个 string->int的map
let mut m = HaspMap::new();
m.insert(String::from("Blue"), 10);


常用的插入就是 insert。用新值替换旧值。还有特殊用法: entry可以实现如果key不存在,才插入,否则不插入或者与旧值合并。

let mut m = HaspMap::new();

m.insert(String::from("Blue"), 10);
m.entry(String::from("Blue")).or_insert(20);

let v = m.entry(String::from("Blue")).or_insert(0);
*v += 20;
  • 打赏
  • 分享
分享到...
请选择打赏方式
  • 微信
  • 支付宝

By yhl

发表回复

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