提问人:php-- 提问时间:10/28/2012 最后编辑:Matthias Braunphp-- 更新时间:10/4/2023 访问量:37453
Rust 中的二维向量
Two dimensional vectors in Rust
问:
编者注:这个问题早于 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赞
Niko Matsakis
10/28/2012
#1
您是否打算所有子数组的长度都为 2,如本例所示?在这种情况下,参数的类型不应是 ,它是 u8 的借用数组,而是 。&[u8]
&[[u8; 2]]
评论
1赞
php--
10/29/2012
我可能会有不同的长度。在这种情况下,我会使用什么?另外,如果我的数组不是正方形的,我会使用什么?例如,如果我有 4 行和 3 列。谢谢。
29赞
Angel Angel
4/27/2016
#2
您可以使用宏 vec!
来创建 2d 矢量。
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赞
dqc
12/29/2021
#3
如果要操作的函数是你的,你可以使用帮助程序方法创建一个自定义结构体,将向量视为 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);
}
关联的函数创建 ,有两个主要方法( 和 ,因此您可以获得借用的索引值 immut ou mut) 并添加一个特征以更好地可视化它(但它存储为 )。new
Vec2d
index
index_mut
Display
Vec<>
0赞
obei
10/4/2023
#4
使用类型批注
let mut vec: Vec<Vec<i32>> = Vec::new();
评论