rust
的标准库中包含了一组常用的集合类,可以将大量数据放在集合中.与内置的 array
和tuple
不同,标准库中的集合类都可以增长和裁剪.
在本章中介绍三种集合类:
- 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;
- 打赏
- 分享
分享到...
请选择打赏方式
- 微信
- 支付宝