目录
一,std基本数据结构
1,std::option
2,std::result
二,std容器
1,vector
三,std算法
1,排序
2,二分
(1)vector二分
(2)自定义二分
rust std 文档
一,std基本数据结构
1,std::option
(1)定义
pub enum Option<T> {None,Some(T),
}
这是一个枚举值,要么等于None,要么等于泛型Some
(2)is_some、is_none
let x:Option<u32>=Some(2);assert_eq!(x.is_some(),true);assert_eq!(x.is_none(),false);let x:Option<u32>=None;assert_eq!(x.is_some(),false);assert_eq!(x.is_none(),true);
(3)is_some_and
let x:Option<u32>=Some(2);assert_eq!(x.is_some_and(|x| x>1),true);
2,std::result
(1)定义
pub enum Result<T, E> {Ok(T),Err(E),
}
这也是个枚举值,要么是等于Option型的OK,要么是等于Option型的Err
2个模板类型可以一样也可以不一样。
(2)is_ok、is_err
let x:Result<i32,i32>=Ok(1);assert_eq!(x.is_ok(),true);assert_eq!(x.is_err(),false);let x:Result<i32,&str>=Err("456");assert_eq!(x.is_ok(),false);assert_eq!(x.is_err(),true);
str类型要带取址符。
(3)is_ok_and、is_err_and
let x:Result<i32,i32>=Ok(1);assert_eq!(x.is_ok_and(|x| x==1),true);assert_eq!(x.is_err(),false);let x:Result<i32,&str>=Err("456");assert_eq!(x.is_ok(),false);assert_eq!(x.is_err_and(|x| x=="456"),true);
(4)ok、err
这里又把result当成结构体,用ok、err取出2个成员值,但至少有一个成员是None值。
let x:Result<i32,i32>=Ok(1);assert_eq!(x.ok(),Some(1));assert_eq!(x.err(),None);let x:Result<i32,&str>=Err("456");assert_eq!(x.ok(),None);assert_eq!(x.err(),Some("456"));
二,std容器
1,vector
fn main() {let mut nums=vec![1,2,4,3];println!("{}",nums.len());
}
三,std算法
1,排序
(1)vector排序
fn main() {let mut nums=vec![1,2,4,3];nums.sort();println!("{}",nums[3]);
}
vector的默认排序,从小到大排序,输出4
2,二分
(1)vector二分
fn search(nums: &Vec<i32>, target:i32)->i32{let res = nums.binary_search(&target);match res{Ok(x)=>x as i32,_=>-1}
}
fn main() {let nums =vec![1,2,4,5];println!("{}",search(&nums,1));println!("{}",search(&nums,4));println!("{}",search(&nums,7));
}
输出:
0
2
-1
(2)自定义二分
trait Solution{fn find(&self,low:i32,high:i32)-> i32;fn check_value(&self,x:i32)->bool;
}
struct SearchData{target:i32
}
impl Solution for SearchData{fn find(&self, low:i32,high:i32)-> i32{let mut low = low;let mut high = high;if self.check_value(high) == false{return high+1;}if self.check_value(low) == true{return low;}while high - low > 1 {let mid = (high + low)/2;if self.check_value(mid) == true{high = mid;}else {low = mid;}}return high;}fn check_value(&self,x:i32)->bool{if x*x*x>self.target{return true;}return false;}
}
fn main() {let x=SearchData{target:100};println!("{}",x.find(0,50));
}
输出5,即5是满足x*x*x>target的最小值。