13

編集者注:この質問はRust 0.1(2013-07-03のタグ付き)よりも前のものであり、構文的に有効なRust1.0コードではありません。回答にはまだ貴重な情報が含まれている可能性があります。

Rustで可変の2次元ベクトルを作成し、それらを操作する関数に渡す方法を知っている人はいますか?

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

extern crate std;

fn promeni(rec: &[u8]) {
    rec[0][1] = 0x01u8;
}

fn main() {
    let mut rec = ~[[0x00u8,0x00u8],
        [0x00u8,0x00u8]
    ];
    io::println(u8::str(rec[0][1]));
    promeni(rec);
    io::println(u8::str(rec[0][1]));
}
4

3 に答える 3

4

この例のように、すべての部分配列の長さを 2 にするつもりでしたか? その場合、パラメータの型は、&[u8]u8 の借用配列である ではなく、むしろ&[[u8; 2]]です。

于 2012-10-28T04:55:52.773 に答える
0

操作する関数が自分のものである場合は、ヘルパー メソッドを使用してカスタム構造体を作成し、ベクトルを 2d として扱うことができます。

use std::fmt;

#[derive(Debug)]
pub struct Vec2d<T> {
    vec: Vec<T>,
    row: usize,
    col: usize,
}

impl<T> Vec2d<T> {
    pub fn new(vec: Vec<T>, row: usize, col: usize) -> Self {
        assert!(vec.len() == row * col);
        Self { vec, row, col }
    }

    pub fn row(&self, row: usize) -> &[T] {
        let i = self.col * row;
        &self.vec[i..(i + self.col)]
    }

    pub fn index(&self, row: usize, col: usize) -> &T {
        let i = self.col * row;
        &self.vec[i + col]
    }

    pub fn index_mut(&mut self, row: usize, col: usize) -> &mut T {
        let i = self.col * row;
        &mut self.vec[i + col]
    }
}

impl<T: std::fmt::Debug> std::fmt::Display for Vec2d<T> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let mut str = String::new();
        for i in 0..self.row {
            if i != 0 {
                str.push_str(", ");
            }
            str.push_str(&format!("{:?}", &self.row(i)));
        }
        write!(f, "[{}]", str)
    }
}

fn main() {
    let mut mv = Vec2d::new(vec![1, 2, 3, 4, 5, 6], 2, 3);
    *mv.index_mut(1, 2) = 10;
    println!("Display: {}", mv);
    println!("Debug: {:?}", mv);
}

関連付けられた関数newは を作成しVec2d、2 つの主要なメソッド (indexおよびindex_mutを使用するため、 immut または mut を借用したインデックス値を取得できます) を作成し、Displayそれをより適切に視覚化するための特性を追加しました (ただし、 として保存されますVec<>)。

于 2021-12-28T19:15:43.643 に答える