我想将矢量(Vec<u8>
)转换为嵌套矢量(Vec<Vec<u8>>
),例如:
[1,2,3,4,5,6] -> [[1,2,3], [4,5,6]]
为此,我不想使用迭代器collect
或reduce
,我想将Vec
转换为C指针:
let ptr_vec = my_vec.as_ptr() as *const libc::c_void;
然后,将此伪 - char *my_vec
转换为伪 - char *my_vec[3]
,因此我不必阅读整个矢量。
这可能吗?如果是这样,它真的会提高巨型载体的性能吗?
答案 0 :(得分:4)
有可能吗?
没有。您无法通过指针转换执行结构更改。在as_ptr
上拨打Vec<u8>
可以获得指向Vec
类型*const u8
元素的指针。将其转换为*const *const [u8; 3]
毫无意义,因为现在您正在尝试将其视为指向u8
数组指针数组的指针。换句话说,您将u8
解释为指向不存在的数组的指针。
更糟糕的是,即使这个 有效,如果你将这个指针转换回Vec<Vec<u8>>
,你就会在你开始解除分配的那一刻崩溃,因为你这样做了在多个Vec
之间拆分原始Vec
的单分配的所有权。这是一个问题,因为不能拆分分配的所有权;每个Vec
都会尝试释放整个内存块。
为此,我不想使用Iterators,......
我无法想到不为此使用迭代器的任何原因,因为此问题的任何有效解决方案将等同于:
fn main() {
let v = vec![1,2,3,4,5,6];
let vs = v.chunks(3).collect::<Vec<_>>();
println!("{:?}", vs);
}
答案 1 :(得分:2)
鉴于你所说的,我愿意打赌你真的不想要一个Vec<Vec<u8>>
,但你想要一种索引你的数据的方法,就像它是一个2D矩形矩阵(即所有行具有相同长度的矩阵)。而且我假设你不想每次都写出实际的公式(row*stride+col
)。 http://crates.io上可能存在一些有用的东西,但是如果你想自己做,你可以将Vec<u8>
包装成一个结构:
struct VecWrapper {
stride: usize,
data: Vec<u8>,
}
impl VecWrapper {
fn get (&self, row: usize, col: usize) -> u8 {
self.data[row*self.stride + col]
}
fn set (&self, row: usize, col: usize, val: u8) {
self.data[row*self.stride + col] = val;
}
}
或者您可以实现Index
和IndexMut
特征来通过[]
运算符进行索引(尽管您需要使用元组索引,并且使用看起来像array[(row, col)]
)