【问题标题】:std::memcpy and copying data from 2D vectorstd::memcpy 并从二维向量复制数据
【发布时间】:2018-04-08 20:16:49
【问题描述】:

我有int *a 用于 5x4 矩阵,其中 5 是行,4 是列。

矩阵的内存分配是列是连续的,每一行都在单独的列之后开始。

我喜欢从vector< vector <int>> b;复制数据

b 也有相同的大小和维度,有 5 行和 4 列。

我是如何获得b 的数据的

b.resize(5);
for(int i = 0; i < 5; i++){
    b[i].resize(4);
}

我喜欢将数据从b 复制到a。 可以使用std::memcpy(a, &amp;b, sizeof (int)*20)吗?

编辑:

对不起,我喜欢以另一种方式复制。 std::memcpy(&amp;b, a, sizeof (int)*20)

【问题讨论】:

  • @VTT 对不起,我喜欢以另一种方式复制。我编辑了。
  • 复制到哪个方向都没关系,只需要从/复制到vector的缓冲区,即使用vector::data()方法返回的指针。此外,由于 b 包含向量,因此您还需要遍历这些向量。
  • vector&lt;vector&lt;T&gt;&gt; 更接近指针数组而不是二维数组。行不连续,因此您不能使用单个 memcopy。

标签: c++ c++11 vector memcpy


【解决方案1】:

不可能使用单个std::memcpy 从展平矩阵 (int[]) 转到正确的矩阵 (std::vector&lt;std::vector&lt;int&gt;&gt;)。有两个原因。首先,没有办法告诉std::memcpy 矩阵尺寸。其次,std::vector 矩阵中的“行”在内存中不需要是连续的,但std::memcpy 只复制到单个地址。

【讨论】:

  • 我想确认一下。你做到了(std::vector 矩阵不需要在内存中是连续的)。
【解决方案2】:

b 在内存中有一个连续的缓冲区,可通过其data() 方法访问。这个缓冲区的每个元素都是另一个std::vector,它又拥有自己的缓冲区指向其他地方。这意味着您不能使用对 memcpy 的单个调用来复制到所有这些 2 级缓冲区。

【讨论】:

  • y 我只能将 memcpy 用于列向量,不能用于行。
猜你喜欢
  • 2015-06-05
  • 2020-04-02
  • 2021-05-28
  • 2021-11-18
  • 1970-01-01
  • 2021-06-12
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多