Rust Data Structures: array

ssivakumar

Sivakumar

Posted on August 1, 2020

Rust Data Structures: array

In this blog post, we will explore Array data structures of Rust.

Array is a fixed-length collection of elements from same data type.

To create & initialize array, it can be done in following different ways:

// Create & Initialize array with value 1
let i_arr: [i32; 5] = [1; 5];
// print array elements
println!("{:?}", i_arr);

PS D:\rust-samples\collections\array> cargo run
[1, 1, 1, 1, 1]
Enter fullscreen mode Exit fullscreen mode

Arrays can be initialized in this approach as well

// Create & initialize array with values
let i_arr: [i32; 5] = [10, 20, 30, 40, 50];
// print array elements
println!("{:?}", i_arr);

PS D:\rust-samples\collections\array> cargo run
[10, 20, 30, 40, 50]
Enter fullscreen mode Exit fullscreen mode

Apart from the above 2 approaches, array can be created & initialized with default values at first and then at later stage it can be updated with different values. For this, it must be declared with mut keyword to denote it as mutuable array.

// Create & Initialize array with default value 0
let mut i_arr: [i32; 5] = [0; 5];
// Update array element value
i_arr[0] = 10;
i_arr[1] = 20;
i_arr[2] = 30;
i_arr[3] = 40;
i_arr[4] = 50;
// print array elements
println!("{:?}", i_arr);

PS D:\rust-samples\collections\array> cargo run
[10, 20, 30, 40, 50]
Enter fullscreen mode Exit fullscreen mode

Built-in array functions

Length function
let i_arr: [i32; 5] = [0; 5];
println!("Length: {}", i_arr.len());

PS D:\rust-samples\collections\array> cargo run
Length: 5
Enter fullscreen mode Exit fullscreen mode
Iterating array
let i_arr: [i32; 5] = [1; 5];
// Array is not iterable

println!("Iterating using IntoIterator implementation...");
// Warning: This works only if your array contains 32 or less elements
// Iterating array 
for i in &i_arr {
    print!("{} ", i);
}
println!("\nIterating using .iter() function...");
// Iterating using .iter() method
for i in i_arr.iter() {
    print!("{} ", i);
}

PS D:\rust-samples\collections\array> cargo run
Iterating using IntoIterator implementation...
1 1 1 1 1 
Iterating using .iter() function...
1 1 1 1 1
Enter fullscreen mode Exit fullscreen mode

When your array has more than 32 elements, iterating using IntoIterator implementation, will throw following error

 --> src\main.rs:8:10
  |
8 | for i in &i_arr {
  |          ^^^^^^ the trait `std::iter::IntoIterator` is not implemented for `&[i32; 33]`
  |
Enter fullscreen mode Exit fullscreen mode
Reverse Iteration
let i_arr: [i32; 5] = [10, 20, 30, 40, 50];
for i in i_arr.iter().rev() {
    print!("{} ", i);
}

PS D:\rust-samples\collections\array> cargo run
50 40 30 20 10
Enter fullscreen mode Exit fullscreen mode
Swapping 2 elements
let mut i_arr: [i32; 5] = [10, 20, 30, 40, 50];
println!("Before swap: {:?}", i_arr);
i_arr.swap(3, 4);
println!("After swap: {:?}", i_arr);

PS D:\rust-samples\collections\array> cargo run
Before swap: [10, 20, 30, 40, 50]
After swap: [10, 20, 30, 50, 40]
Enter fullscreen mode Exit fullscreen mode

It will be panic when either of indice go out of bound

let mut i_arr: [i32; 5] = [10, 20, 30, 40, 50];
println!("Before swap: {:?}", i_arr);
i_arr.swap(3, 5);
println!("After swap: {:?}", i_arr);

PS D:\rust-samples\collections\array> cargo run
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 5', C:\Users\Vinay\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\src\libcore\slice\mod.rs:512:35
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `target\debug\array.exe` (exit code: 101)
Enter fullscreen mode Exit fullscreen mode
Sort an array
let mut i_arr: [i32; 5] = [50, 40, 30, 20, 10];
println!("Before sorting: {:?}", i_arr);
i_arr.sort();
println!("After sorting: {:?}", i_arr);

PS D:\rust-samples\collections\array> cargo run
Before sorting: [50, 40, 30, 20, 10]
After sorting: [10, 20, 30, 40, 50]
Enter fullscreen mode Exit fullscreen mode
Sorting array using custom comparator function

In case, if you would like to sort an array of String literals by using its length, you can use custom comparator function.

let mut s_arr = [String::from("C"), 
String::from("C++"), 
String::from("R"), 
String::from("Rust"), 
String::from("Java"), 
String::from("Python")];

println!("Before sorting: {:?}", s_arr);

// Sorting by custom comparator function
s_arr.sort_by(|a, b| a.len().cmp(&b.len()));

println!("After sorting: {:?}", s_arr);

PS D:\rust-samples\collections\array> cargo run
Before sorting: ["C", "C++", "R", "Rust", "Java", "Python"]
After sorting: ["C", "R", "C++", "Rust", "Java", "Python"]
Enter fullscreen mode Exit fullscreen mode
Filter a collection

In case if you would like to filter out some items in your array, you can use starts_with(), ends_with() or contains() functions.

All these functions checks if the first element of slice has the character passed as argument. See below:

let s_arr = [String::from("C"), 
String::from("C++"), 
String::from("R"), 
String::from("Rust"), 
String::from("Java"), 
String::from("Python")];

println!("starts_with() C?: {}", s_arr.starts_with(&["C".to_string()]));
println!("starts_with() J?: {}", s_arr.starts_with(&["J".to_string()]));
println!("ends_with() a?: {}", s_arr.ends_with(&["a".to_string()]));
println!("contains() t?: {}", s_arr.contains(&"n".to_string()));

PS D:\rust-samples\collections\array> cargo run
starts_with() C?: true
starts_with() J?: false
ends_with() a?: false
contains() t?: false
Enter fullscreen mode Exit fullscreen mode
Binary Search

In case if you have sorted array, you can use binary_search() function to search for a given element from array.

To use binary_search() on an array, it must be a sorted.

let s_arr = [String::from("C"), 
String::from("C++"),  
String::from("Java"),
String::from("R"), 
String::from("Rust"), 
String::from("Python")];

match s_arr.binary_search(&"Java".to_string()) {
    Ok(value) => println!("Found the index {}", value),
    Err(e) => println!("Error!!! Most possible index where the value can be inserted... {}", e),
}

match s_arr.binary_search(&"Scala".to_string()) {
    Ok(value) => println!("Found the index {}", value),
    Err(e) => println!("Error!!! Most possible index where the value can be inserted... {}", e),
}

PS D:\rust-samples\collections\array> cargo run
Found the index 2
Error!!! Most possible index where the value can be inserted... 6
Enter fullscreen mode Exit fullscreen mode

Please kindly share your comments, if any.

Happy reading!!!

💖 💪 🙅 🚩
ssivakumar
Sivakumar

Posted on August 1, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related