Rust
      
      .
Rustbook
      
      , , , -.
Rust
      
      , , vis-à-vis
C/C++
      
      .
Rust
      
      , (, ,
RAII
      
      .) «»
C
      
      .
C++
      
      .
Rust
      
      C++, , .
: , ,
Rust
      
      . ,
Rust
      
      C++, .
Rust
      
      C++.
. , , , . , , , . github. . .
Rust
+
Rust
      
      « » : , ( , ),
gdb
      
      .
Rust
      
      , .
+ , : , , , . , () (
STL
      
      C++
      
      ).
+ (
std::move
      
      , ). (
&
      
      ,
C++
      
      ).
+ —
   UTF-8
      
      . ,
(N)
      
      , .
+ ( ). , (,
Python
      
      ).
+-
Rust
      
      , .
Rust
      
      , . , .
- , ( borrow checker) , ( ). , , borrow checker'.
-
Rust
      
      , , .
C++
      
      Rust
      
      .
-
Rust
      
      . , StackOverflow. . , GUI,
wxWidgets
      
      ,
Qt
      
      .
Rust
B A. n , n — - B ( A ). .
// 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
      
      . , , .
Node:
// 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
— . -  Node     / 
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()
, . 
: . , . : (0 — , 1 — ), , .
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;
— .
Rust vs C++
, , , . Intel Core i7-4770, 16GB DDR3, SSD, Linux Mint 18.1 64-bit. :
[>] rustc --version rustc 1.22.1 (* 2017-11-22) [>] g++ -v ... gcc version 7.2.0
      :
-     ,     ,      
/dev/null
 - * (core) ( /)
 - 10 ,
 - , , , . .
 -   ,    
C++
- /iostream
. . ,std::sync_with_stdio(false)
 -   , 
Rust
Huffman encoding
HashMap
 -      
Rust
,C++
. , . -     , 
Rust
10%, , , . 
, , ,
Rust
      
      C++
      
      . , , , .
, github: https://github.com/dmitryikh/rust-vs-cpp-bench.
, !
11.12.2017
!
:
-   
binary_search
.Option
 -  
Binary_search
A, A -  
-DNDEBUG
C++
. .. -      
Huffman_decoding
, - C++ . . - , - .
 
. , ±10% .