Rust中的二维向量

21

编辑注:这个问题早于Rust 0.1(标记为2013-07-03)并且不是Rust 1.0代码的语法有效。答案仍可能包含有价值的信息。

有人知道如何在Rust中创建可变的二维向量,并将它们传递给一个函数进行操作吗?

这是我迄今为止尝试过的:

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个回答

29

您可以使用宏vec!来创建二维向量。

fn test(vec: &mut Vec<Vec<char>>){
    vec[0][0] = 'd';
    ..//
    vec[23][79] = 'd';
}

fn main() {

    let mut vec = vec![vec!['#'; 80]; 24];

    test(&mut vec);
}

4

如果要操作的函数是您自己编写的,您可以创建一个自定义结构体,其中包含辅助方法,以将向量视为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,它有两个主要方法(indexindex_mut,所以你可以获得一个不可变或可变的索引值)并添加了一个Display特性来更好地可视化它(但它存储为Vec<>)。


4

您是否希望所有的子数组都像这个例子一样具有长度2?如果是的话,那么参数的类型就不应该是&[u8],它是一个借用的u8数组,而应该是&[[u8; 2]]


1
我可能会有不同长度的数组。在这种情况下,我应该使用什么?如果我的数组不是正方形的,我应该使用什么?例如,如果我有4行和3列。谢谢。 - php--

0
使用类型注释
let mut vec: Vec<Vec<i32>> = Vec::new();

感谢您为Stack Overflow社区做出的贡献。这可能是一个正确的答案,但如果您能提供代码的额外解释,让开发人员能够理解您的思路,那将非常有帮助。对于那些对语法不太熟悉或者正在努力理解概念的新手开发人员来说,这尤其有用。您是否愿意编辑您的答案,以便为社区的利益提供更多细节? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接