web-dev-qa-db-ja.com

Rustで2次元配列を作成する

Rustで空の変更可能な2次元配列を作成するにはどうすればよいですか?

これは私がこれまでに試したことです:

let mut state[[u8 * 4] * 4];

これによりエラーが発生します

error: expected one of `:`, `;`, `=`, or `@`, found `[`
 --> src/main.rs:2:18
  |
2 |     let mut state[[u8 * 4] * 4];
  |                  ^ expected one of `:`, `;`, `=`, or `@` here
32
php--

編集者注:この回答はRust 1.0より前のものであり、一部の概念と構文が変更されています。他の回答はRust 1.0。

配列の内容を変更可能にしますか、それを保持する変数にしますか?変更可能なコンテンツが必要な場合、これでうまくいきますか?

let state = [mut [mut 0u8, ..4], ..4];

変数を変更可能にしたいが、内容は変更したくない場合は、以下を試してください:

let mut state = [[0u8, ..4], ..4];

これは役に立ちますか?実際にはコンパイルしなかったため、構文が少しずれている可能性があります。

9
Eric Holk

Rust 1.0では、以下が機能します:

let mut state = [[0u8; 4]; 6];
state[0][1] = 42;

内部セグメントの長さはタイプの不可欠な部分であることに注意してください。たとえば、次のようにstateを参照(および渡す)できます。

let a: &[[u8; 4]] = &state;

しかし、サブ配列の固定長を指定せずにではありません。可変長のサブ配列が必要な場合は、次のようにする必要があります。

let x: [Box<[u8]>; 3] = [
    Box::new([1, 2, 3]),
    Box::new([4]), 
    Box::new([5, 6])
];
let y: &[Box<[u8]>] = &x;
40
dhardy

次のような動的サイズの2Dベクトルを作成できます。

fn example(width: usize, height: usize) {
    // Base 1d array
    let mut grid_raw = vec![0; width * height];

    // Vector of 'width' elements slices
    let mut grid_base: Vec<_> = grid_raw.as_mut_slice().chunks_mut(width).collect();

    // Final 2d array
    let grid: &mut [&mut [_]] = grid_base.as_mut_slice();

    // Accessing data
    grid[0][0] = 4;
}
11
Procrade

初期化:
2D配列の初期化にはいくつかの方法があります。

  1. M(行)およびN(列)の定数の使用

    const M: usize = 2;
    const N: usize = 4;
    
    let mut grid = [[0 as u8; N] ; M];
    
  2. 型注釈を使用した明示的な宣言

    let mut grid: [[u8; 4]; 2] = [[0; 4]; 2];
    

トラバース:
read-onlyトラバースは次のように簡単です:

for (i, row) in grid.iter().enumerate() {
    for (j, col) in row.iter().enumerate() {
        print!("{}", col);
    }
    println!()
}

または

for el in grid.iter().flat_map(|r| r.iter()) {
    println!("{}", el);
}

要素を更新しています:

for (i, row) in grid.iter_mut().enumerate() {
    for (j, col) in row.iter_mut().enumerate() {
        col = 1;
    }
}
5
magiccrafter

慣用的なC 2次元配列は、配列へのアクセス時に使用されるのと同じ順序の配列サイズを使用して宣言されます。

// Declaration
int array_2d[8][16]; // An 8 by 16 2D array
...
// Access
array_2d[0][1] = 5;

Rustでは、宣言のサイズが反転します。 8 x 16の2次元配列を作成するための構文は次のとおりです。

// Declaration
let mut array_2d: [[i32; 16]; 8];
...
// Access (same as idiomatic C. types for added explicitness)
array_2d[0_usize][1_usize] = 5;
2
spatulaninja