Rust. Rustbook, , , -.Rust , , vis-à-vis C/C++. Rust, (, , RAII .) «» C . C++.Rust C++, , .Rust. , Rust C++, . Rust C++.Rust « » : , ( , ), gdb. Rust , .STL C++).std::move, ). ( &, C++).UTF-8. , (N) , .Python).Rust , . Rust , . , .Rust , , . C++ Rust .Rust . , StackOverflow. . , GUI, wxWidgets, Qt.// return position of the element if found
fn binary_search(vec: &[u32], value: u32) -> Option<usize> {
let mut l: i32 = 0;
let mut r: i32 = vec.len() as i32 - 1;
while l <= r {
let i = ((l + r) / 2) as usize;
if vec[i] == value {
return Some(i);
} else if vec[i] > value {
r = i as i32 - 1;
} else if vec[i] < value {
l = i as i32 + 1;
}
}
None
}
Rust, :mutRust , . l = i as i32 + 1stdinfn read_line() -> String {
let mut line = String::new();
io::stdin().read_line(&mut line).unwrap();
line.trim().to_string()
}
fn main() {
// 1. Read the array
let n: usize = read_line().parse().unwrap();
let mut a_vec: Vec<u32> = vec![0; n as usize];
for (i, token) in read_line().split_whitespace().enumerate() {
a_vec[i] = token.parse().unwrap();
}
...
String::new() .Option, None . unwrap panic!, None.String::parse , .. .Rust ( Python). split_whitespace().enumerate() , ._merge, in place .fn _merge(left_slice: &mut [u32], right_slice: &mut [u32]) -> u64
Rust unsafe , .. , . Rust ( , , — ). :fn _merge(vec: &mut [u32], left: usize, mid: usize, right: usize) -> u64
Rust — , .., , mut , . unsafe . , , .// Type of the reference to the node
type Link = Option<Box<Node>>;
// Huffman tree node struct
#[derive(Debug,Eq)]
struct Node {
freq: u32,
letter: char,
left: Link,
right: Link,
}
impl Ord for Node {
// reverse order to make Min-Heap
fn cmp(&self, b: &Self) -> Ordering {
b.freq.cmp(&self.freq)
}
}
#[derive(Debug,Eq)]. Debug — -. Eq — .Ord. . , Node Min-.impl Node {
...
// traverse tree building letter->code `map`
fn build_map(&self, map: &mut HashMap<char, String>, prefix: String) {
match self.right {
Some(ref leaf) => leaf.build_map(map, prefix.clone() + "1"),
_ => { },
}
match self.left {
Some(ref leaf) => { leaf.build_map(map, prefix + "0"); },
_ => { map.insert(self.letter, prefix); },
}
}
}
&Some(ref leaf).match switch C. match , _ => { }.prefix.clone(), .Rust , , , , . :fn add_letter(root: &mut Link, letter: char, code: &str) {
let mut p: &mut Node = root.as_mut().unwrap();
for c in code.chars() {
p = match {p} {
&mut Node {left: Some(ref mut node), ..} if c == '0' => {
node
},
&mut Node {left: ref mut opt @ None, ..} if c == '0' => {
*opt = Node::root();
opt.as_mut().unwrap()
},
&mut Node {right: Some(ref mut node), ..} if c == '1' => {
node
},
&mut Node {right: ref mut opt @ None, ..} if c == '1' => {
*opt = Node::root();
opt.as_mut().unwrap()
},
_ => { panic!("error"); }
}
}
p.letter = letter;
}
match p. &mut Node {left: Some(ref mut node), ..} if c == '0' « p Node , left node c '0'».Rust , panic!("...") ( ).fn get_levenshtein_distance(str1: &str, str2: &str) -> u32 {
let n = str1.len() + 1;
let m = str2.len() + 1;
// compute 2D indexes into flat 1D index
let ind = |i, j| i * m + j;
let mut vec_d: Vec<u32> = vec![0; n * m];
for i in 0..n {
vec_d[ind(i, 0)] = i as u32;
}
for j in 0..m {
vec_d[ind(0, j)] = j as u32;
}
for (i, c1) in str1.chars().enumerate() {
for (j, c2) in str2.chars().enumerate() {
let c = if c1 == c2 {0} else {1};
vec_d[ind(i + 1, j + 1)] = min( min( vec_d[ind(i, j + 1)] + 1
, vec_d[ind(i + 1, j)] + 1
)
, vec_d[ind(i, j)] + c
);
}
}
return vec_d[ind(n - 1, m - 1)];
}
str1: &str — . , , std::string_view C++17.let ind = |i, j| i * m + j; — .[>] rustc --version
rustc 1.22.1 (* 2017-11-22)
[>] g++ -v
...
gcc version 7.2.0

/dev/nullC++ - / iostream. . , std::sync_with_stdio(false)Rust Huffman encoding HashMapRust , C++. , .Rust 10%, , , .Rust C++. , , , .binary_search. OptionBinary_search A, A-DNDEBUG C++. ..Huffman_decoding, - C++ . .Source: https://habr.com/ru/post/344282/
All Articles