55

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
4

10 に答える 10

68

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;
于 2015-01-16T13:02:17.843 に答える
23

編集者注:この回答はRust 1.0よりも前のものであり、いくつかの概念と構文が変更されています。他の答えはRust1.0に適用されます。

配列の内容を変更可能にしますか、それともそれを保持する変数にしますか?変更可能なコンテンツが必要な場合、これは機能しますか?

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

変数を変更可能にしたいが内容は変更したくない場合は、次のことを試してください。

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

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

于 2012-11-05T15:39:08.730 に答える
20

次のように動的なサイズの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 `&mut [&mut [_]]`
    let grid = grid_base.as_mut_slice();

    // Accessing data
    grid[0][0] = 4;
}
于 2016-04-02T17:30:06.440 に答える
15

Vecコンパイル時に既知のサイズがない場合は、(を使用して)次のような2D配列を作成することもできます。

let width = 4;
let height = 4;

let mut array = vec![vec![0; width]; height];

次のように使用します。

array[2][2] = 5;

println!("{:?}", array);

出力:

0 0 0 0 0
0 0 0
0 0 5 0
0 0 0 0

rust1.0.0以降で利用可能https://doc.rust-lang.org/std/vec/struct.Vec.html

于 2019-11-26T03:00:29.997 に答える
10

初期化:
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];
    

トラバース:読み取り専用
のトラバースは次のように簡単です。

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;
    }
}
于 2018-12-26T10:17:46.133 に答える
5

あなたが木枠を設置することにオープンであるならば、あなたのndarrayためにそれを優雅に行うことができます。

use ndarray::Array2;
let mut array = Array2::zeros((4, 3));
array[[1, 1]] = 7;

既存の回答のいくつかでは、一定でない次元を使用して配列を作成することはできません。にはそのような問題はありませんndarray。2次元以上の次元を簡単に作成することもできます。

詳細については、こちらこちらをご覧ください。

于 2020-04-19T19:32:41.660 に答える
3

さて、ベクトルを作成する方法の問題は、上記で適切に扱われています。2次元ベクトルを作成し、それをユーザー入力で埋めるためのコードスニペットは次のとおりです。

use std::io;

fn main(){
    let width = 4;
    let height = 4;

    let mut array = vec![vec![0; width]; height];

    for i in 0..4 {
        let mut xstr = String::from("");
        io::stdin().read_line(&mut xstr).ok().expect("read error");
        array[i] = xstr
            .split_whitespace()
            .map(|s| s.parse().expect("parse error"))
            .collect();
    }

    println!("{:?}", array)
}

于 2020-06-29T10:59:19.523 に答える
2

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

// 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;
于 2018-02-15T17:23:38.933 に答える
2

2次元文字列配列の別の例:

fn main() {
    let width = 2;
    let height = 3;

    let mut a: Vec<Vec<String>> = vec![vec![String::from(""); width]; height];

    for i in 0..height {
        for j in 0..width {
            let s = format!("{}:{}", i + 1, j + 1);
            a[i][j] = s;
        }
    }
    println!("{:?}", a);
}

出力:

[
  ["1:1", "1:2"],
  ["2:1", "2:2"],
  ["3:1", "3:2"]
]

しかし、なぜこのフォームを使用できないのかわかりませんa = [[String::from(""), 2], 3]vec![]との違いがわかりません[]

于 2020-10-11T14:03:23.610 に答える
2

明示的な初期化あり

let directions: [[i32; 2]; 4] = [[-1, 0], [0, 1], [0, 1], [1, 0]]

同じ値で

let directions: [[i32; 2]; 4] = [[0; 2]; 4];
于 2021-02-08T00:50:42.730 に答える