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
, :mut
Rust
, . l = i as i32 + 1
stdin
fn 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/null
C++
- / iostream
. . , std::sync_with_stdio(false)
Rust
Huffman encoding
HashMap
Rust
, C++
. , .Rust
10%, , , .Rust
C++
. , , , .binary_search
. Option
Binary_search
A, A-DNDEBUG
C++
. ..Huffman_decoding
, - C++ . .Source: https://habr.com/ru/post/344282/
All Articles