rust腐竹是什么意思_学习Rust 集合与字符串
Rust 語言是一種高效、可靠的通用高級語言。其高效不僅限于開發效率,它的執行效率也是令人稱贊的,是一種少有的兼顧開發效率和執行效率的語言。
集合(Collection)是數據結構中最普遍的數據存放形式,Rust 標準庫中提供了豐富的集合類型幫助開發者處理數據結構的操作。
向量
向量(Vector)是一個存放多值的單數據結構,該結構將相同類型的值線性的存放在內存中。
向量是線性表,在 Rust 中的表示是 Vec。
向量的使用方式類似于列表(List),我們可以通過這種方式創建指定類型的向量:
let?vector:?Vec=?Vec::new();?//?創建類型為?i32?的空向量
let?vector?=?vec![1,?2,?4,?8];?????//?通過數組創建向量
我們使用線性表常常會用到追加的操作,但是追加和棧的 push 操作本質是一樣的,所以向量只有 push 方法來追加單個元素:
實例
fn?main()?{
let?mut?vector?=?vec![1,?2,?4,?8];
vector.push(16);
vector.push(32);
vector.push(64);
println!("{:?}",?vector);
}
運行結果:
[1,?2,?4,?8,?16,?32,?64]
append 方法用于將一個向量拼接到另一個向量的尾部:
實例
fn?main()?{
let?mut?v1:?Vec=?vec![1,?2,?4,?8];
let?mut?v2:?Vec=?vec![16,?32,?64];
v1.append(&mut?v2);
println!("{:?}",?v1);
}
運行結果:
[1,?2,?4,?8,?16,?32,?64]
get 方法用于取出向量中的值:
實例
fn?main()?{
let?mut?v?=?vec![1,?2,?4,?8];
println!("{}",?match?v.get(0)?{
Some(value)?=>?value.to_string(),
None?=>?"None".to_string()
});
}
運行結果:
1
因為向量的長度無法從邏輯上推斷,get 方法無法保證一定取到值,所以 get 方法的返回值是 Option 枚舉類,有可能為空。
這是一種安全的取值方法,但是書寫起來有些麻煩。如果你能夠保證取值的下標不會超出向量下標取值范圍,你也可以使用數組取值語法:
實例
fn?main()?{
let?v?=?vec![1,?2,?4,?8];
println!("{}",?v[1]);
}
運行結果:
2
但如果我們嘗試獲取 v[4] ,那么向量會返回錯誤。
遍歷向量:
實例
fn?main()?{
let?v?=?vec![100,?32,?57];
for?i?in?&v?{
println!("{}",?i);
}
}
運行結果:
100
32
57
如果遍歷過程中需要更改變量的值:
實例
fn?main()?{
let?mut?v?=?vec![100,?32,?57];
for?i?in?&mut?v?{
*i?+=?50;
}
}
字符串
字符串類(String)到本章為止已經使用了很多,所以有很多的方法已經被讀者熟知。本章主要介紹字符串的方法和 UTF-8 性質。
新建字符串:
let?string?=?String::new();
基礎類型轉換成字符串:
let?one?=?1.to_string();?????????//?整數到字符串
let?float?=?1.3.to_string();?????//?浮點數到字符串
let?slice?=?"slice".to_string();?//?字符串切片到字符串
包含 UTF-8 字符的字符串:
let?hello?=?String::from("????????????");
let?hello?=?String::from("Dobry?den");
let?hello?=?String::from("Hello");
let?hello?=?String::from("???????");
let?hello?=?String::from("??????");
let?hello?=?String::from("こんにちは");
let?hello?=?String::from("?????");
let?hello?=?String::from("你好");
let?hello?=?String::from("Olá");
let?hello?=?String::from("Здравствуйте");
let?hello?=?String::from("Hola");
字符串追加:
let?mut?s?=?String::from("run");
s.push_str("oob");?//?追加字符串切片
s.push('!');???????//?追加字符
用 + 號拼接字符串:
let?s1?=?String::from("Hello,?");
let?s2?=?String::from("world!");
let?s3?=?s1?+?&s2;
這個語法也可以包含字符串切片:
let?s1?=?String::from("tic");
let?s2?=?String::from("tac");
let?s3?=?String::from("toe");
let?s?=?s1?+?"-"?+?&s2?+?"-"?+?&s3;
使用 format! 宏:
let?s1?=?String::from("tic");
let?s2?=?String::from("tac");
let?s3?=?String::from("toe");
let?s?=?format!("{}-{}-{}",?s1,?s2,?s3);
字符串長度:
let?s?=?"hello";
let?len?=?s.len();
這里?len?的值是?5。
let?s?=?"你好";
let?len?=?s.len();
這里 len 的值是 6。因為中文是 UTF-8 編碼的,每個字符長 3 字節,所以長度為6。但是 Rust 中支持 UTF-8 字符對象,所以如果想統計字符數量可以先取字符串為字符集合:
let?s?=?"hello你好";
let?len?=?s.chars().count();
這里 len 的值是 7,因為一共有 7 個字符。統計字符的速度比統計數據長度的速度慢得多。
遍歷字符串:
實例
fn?main()?{
let?s?=?String::from("hello中文");
for?c?in?s.chars()?{
println!("{}",?c);
}
}
運行結果:
h
e
l
l
o
中
文
從字符串中取單個字符:
實例
fn?main()?{
let?s?=?String::from("EN中文");
let?a?=?s.chars().nth(2);
println!("{:?}",?a);
}
運行結果:
Some('中')
注意:nth 函數是從迭代器中取出某值的方法,請不要在遍歷中這樣使用!因為 UTF-8 每個字符的長度不一定相等!
如果想截取字符串字串:
實例
fn?main()?{
let?s?=?String::from("EN中文");
let?sub?=?&s[0..2];
println!("{}",?sub);
}
運行結果:
EN
但是請注意此用法有可能肢解一個 UTF-8 字符!那樣會報錯:
實例
fn?main()?{
let?s?=?String::from("EN中文");
let?sub?=?&s[0..3];
println!("{}",?sub);
}
運行結果:
thread?'main'?panicked?at?'byte?index?3?is?not?a?char?boundary;?it?is?inside?'中'?(bytes?2..5)?of?`EN中文`',?src\libcore\str\mod.rs:2069:5
note:?run?with?`RUST_BACKTRACE=1`?environment?variable?to?display?a?backtrace.
映射表
映射表(Map)在其他語言中廣泛存在。其中應用最普遍的就是鍵值散列映射表(Hash Map)。
新建一個散列值映射表:
實例
use?std::collections::HashMap;
fn?main()?{
let?mut?map?=?HashMap::new();
map.insert("color",?"red");
map.insert("size",?"10?m^2");
println!("{}",?map.get("color").unwrap());
}
注意:這里沒有聲明散列表的泛型,是因為 Rust 的自動判斷類型機制。
運行結果:
red
insert 方法和 get 方法是映射表最常用的兩個方法。
映射表支持迭代器:
實例
use?std::collections::HashMap;
fn?main()?{
let?mut?map?=?HashMap::new();
map.insert("color",?"red");
map.insert("size",?"10?m^2");
for?p?in?map.iter()?{
println!("{:?}",?p);
}
}
運行結果:
("color",?"red")
("size",?"10?m^2")
迭代元素是表示鍵值對的元組。
Rust 的映射表是十分方便的數據結構,當使用 insert 方法添加新的鍵值對的時候,如果已經存在相同的鍵,會直接覆蓋對應的值。如果你想"安全地插入",就是在確認當前不存在某個鍵時才執行的插入動作,可以這樣:
map.entry("color").or_insert("red");
這句話的意思是如果沒有鍵為 "color" 的鍵值對就添加它并設定值為 "red",否則將跳過。
在已經確定有某個鍵的情況下如果想直接修改對應的值,有更快的辦法:
實例
use?std::collections::HashMap;
fn?main()?{
let?mut?map?=?HashMap::new();
map.insert(1,?"a");
if?let?Some(x)?=?map.get_mut(&1)?{
*x?=?"b";
}
}
總結
以上是生活随笔為你收集整理的rust腐竹是什么意思_学习Rust 集合与字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 遍历列表python_Python 遍历
- 下一篇: 5b计算机联锁系统_力控科技油库调度管理