1 | use std::convert::TryInto;
|
---|
2 | use std::convert::TryFrom;
|
---|
3 | fn main() {
|
---|
4 | // typed/size/repeat initialization
|
---|
5 | let val = 42;
|
---|
6 | let mut ia: [usize; 5] = [val; 5];
|
---|
7 |
|
---|
8 | // typed/size/individual initialization
|
---|
9 | let fval = 42.2;
|
---|
10 | let fa: [f64; 5] = [1.2, fval, 5.6, 7.3, 9.1];
|
---|
11 |
|
---|
12 | // enumerating range/type
|
---|
13 | for i in 0..ia.len() { print!("{:?} ", ia[i] ); } println!(""); // 42 42 42
|
---|
14 | for fv in fa { print!("{:?} ", fv ); } println!(""); // 1.2 42.2 5.6
|
---|
15 | for i in 0..=1 { ia[i] = i; } // mutable changes
|
---|
16 | for iv in ia { print!("{:?} ", iv ); } println!(""); // 0 1 42
|
---|
17 |
|
---|
18 | // 2 dimensional (matrix), fixed-size
|
---|
19 | const ROWS: usize = 4;
|
---|
20 | const COLS: usize = 6;
|
---|
21 | let mut fmatrix: [[f64; COLS]; ROWS] = [[0.; COLS]; ROWS];
|
---|
22 | for r in 0 .. ROWS {
|
---|
23 | for c in 0 .. COLS {
|
---|
24 | fmatrix[r][c] = r as f64 + c as f64;
|
---|
25 | }
|
---|
26 | println!( "{:?}", fmatrix[r] );
|
---|
27 | }
|
---|
28 |
|
---|
29 | let mut slice2: &[f64] = &fmatrix[3][2 ..= 4];
|
---|
30 | println!( "{:?}", slice2 );
|
---|
31 | slice2 = &fmatrix[1 ..= 3][1];
|
---|
32 | println!( "{:?}", slice2 );
|
---|
33 |
|
---|
34 | // implicit type/size, print entire array and length
|
---|
35 | println!( "{:?} {:?}", ia, ia.len() );
|
---|
36 | ia = [5; 5];
|
---|
37 | println!( "{:?} {:?}", ia, ia.len() );
|
---|
38 | ia = [1, 2, 3, 4, 5];
|
---|
39 | println!( "{:?} {:?}", ia, ia.len() );
|
---|
40 |
|
---|
41 | // array copy
|
---|
42 | let ia2: [usize; 5];
|
---|
43 | ia2 = ia;
|
---|
44 | println!( "copy = {:?} ", ia2 ); // 0 1 42
|
---|
45 |
|
---|
46 | let mut numbers = [1, 2, 3, 4, 5];
|
---|
47 | // pass array by value
|
---|
48 | fn update1( mut arr:[i32; 5] ) {
|
---|
49 | for i in 0 .. arr.len() { arr[i] = 0; }
|
---|
50 | println!( "function update {:?}", arr );
|
---|
51 | }
|
---|
52 | update1( numbers );
|
---|
53 |
|
---|
54 | // pass array by reference
|
---|
55 | fn update2( arr: & mut [i32; 5] ) {
|
---|
56 | for i in 0 .. arr.len() { arr[i] = 0; }
|
---|
57 | println!( "function update {:?}", arr );
|
---|
58 | }
|
---|
59 | update2( &mut numbers );
|
---|
60 |
|
---|
61 | // slice is barrowing a subset of an array, dimension bounds can be expressions
|
---|
62 | println!( "slice {:?}", &ia[0..3] ); // fixed bounds, [1, 2, 3]
|
---|
63 | println!( "slice {:?}", &ia[ia.len() - 2 .. ia.len()] ); // variable bounds, [4, 5]
|
---|
64 | println!( "slice {:?}", &ia[ia.len() - 2 .. ] ); // drop upper bound, [4, 5]
|
---|
65 | println!( "slice {:?}", &ia[.. ia.len() - 2 ] ); // drop lower bound, [1, 2, 3]
|
---|
66 | println!( "slice {:?}", &ia[..] ); // drop both bound, [1, 2, 3, 4, 5]
|
---|
67 |
|
---|
68 | let slice: &[f64];
|
---|
69 | slice = &fa[0 ..= 1];
|
---|
70 | println!( "slice = {:?}", slice ); // [1.2, 42.2]
|
---|
71 | let mut fa2: [f64; 2] = <[f64; 2]>::try_from( slice ).unwrap(); // convert slice to array
|
---|
72 | println!( "fa2 {:?}", fa2 ); // [1.2, 42.2]
|
---|
73 | fa2 = (& fa[2 ..= 3]).try_into().unwrap(); // convert slice to array
|
---|
74 | println!( "fa2 {:?}", fa2 ); // [1.2, 42.2]
|
---|
75 |
|
---|
76 | // pass (all) slice by reference
|
---|
77 | fn zero( arr: & mut [usize] ){
|
---|
78 | for i in 0 .. arr.len() { arr[i] = 0; }
|
---|
79 | println!( "function update {:?}", arr );
|
---|
80 | }
|
---|
81 | zero( & mut ia[0..5] );
|
---|
82 | zero( & mut ia[0..3] );
|
---|
83 |
|
---|
84 | let mut vec: Vec< Vec<usize> > = Vec::new();
|
---|
85 | for r in 0 .. ROWS {
|
---|
86 | let mut row: Vec<usize> = Vec::new();
|
---|
87 | for c in 0 .. COLS {
|
---|
88 | row.push(r + c);
|
---|
89 | }
|
---|
90 | vec.push(row);
|
---|
91 | }
|
---|
92 | for r in 0 .. 4 {
|
---|
93 | for c in 0 .. 4 {
|
---|
94 | print!("{} ", vec[r][c]);
|
---|
95 | }
|
---|
96 | println!("");
|
---|
97 | }
|
---|
98 |
|
---|
99 | // 2 dimensional (matrix), variable-size (C++ vector) array of array, heap allocated
|
---|
100 | let (rows, cols) = (4, 6);
|
---|
101 | let mut matrix = vec![vec![0; cols]; rows];
|
---|
102 | for r in 0 .. rows {
|
---|
103 | for c in 0 .. cols {
|
---|
104 | matrix[r][c] = r + c;
|
---|
105 | print!("{} ", matrix[r][c]);
|
---|
106 | }
|
---|
107 | println!("");
|
---|
108 | }
|
---|
109 |
|
---|
110 | let mut slice3: &[usize] = &matrix[3][2 ..= 4];
|
---|
111 | println!( "{:?}", slice3 );
|
---|
112 | slice3 = &matrix[1 ..= 3][1];
|
---|
113 | println!( "{:?}", slice3 );
|
---|
114 |
|
---|
115 | fn f<const N: usize>( arg: [usize; N] ) {
|
---|
116 | for r in 0 .. arg.len() {
|
---|
117 | print!( "{} ", arg[r] );
|
---|
118 | }
|
---|
119 | println!("");
|
---|
120 | }
|
---|
121 | f( ia );
|
---|
122 | }
|
---|
123 |
|
---|
124 | // Local Variables: //
|
---|
125 | // tab-width: 4 //
|
---|
126 | // compile-command: "rustc arrays.rs" //
|
---|
127 | // End: //
|
---|