是否可以使用libc指针将矢量转换为嵌套矢量?

时间:2017-10-16 22:21:38

标签: c rust libc

我想将矢量(Vec<u8>)转换为嵌套矢量(Vec<Vec<u8>>),例如:

[1,2,3,4,5,6] -> [[1,2,3], [4,5,6]]

为此,我不想使用迭代器collectreduce,我想将Vec转换为C指针:

let ptr_vec = my_vec.as_ptr() as *const libc::c_void;

然后,将此伪 - char *my_vec转换为伪 - char *my_vec[3],因此我不必阅读整个矢量。

这可能吗?如果是这样,它真的会提高巨型载体的性能吗?

2 个答案:

答案 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;
   }
}

或者您可以实现IndexIndexMut特征来通过[]运算符进行索引(尽管您需要使用元组索引,并且使用看起来像array[(row, col)]