从 std::vector<std::vector<float>> 转换为 float**

Posted

技术标签:

【中文标题】从 std::vector<std::vector<float>> 转换为 float**【英文标题】:Convert from std::vector<std::vector<float>> to float** 【发布时间】:2012-10-20 19:48:47 【问题描述】:

有一个函数接受float** 参数。 我在std::vector&lt;std::vector&lt;float&gt;&gt; 类型的变量中有值。

是否可以在不分配临时float*[] 的情况下进行这样的转换?

【问题讨论】:

是的。你试过什么?这只是分配内存然后使用 2 个 for 循环并遍历两个向量的问题。 【参考方案1】:

不是直接的,但您不必从“内部”向量中复制数据。相反,您可以创建一个指向每个内部向量的 data() 属性的指针数组。

【讨论】:

【参考方案2】:

这将起作用:

std::vector<std::vector<float>> source;

std::vector<float*> target(source.size());
for (int i = 0; i < source.size(); ++i)
  target[i] = &*source[i].begin();

如您所见,您不需要复制内部std::vector&lt;&gt;s,但您需要重新创建外部。 std::vector&lt;&gt; 保证其成员的线性存储(意味着它与 C 数组兼容),因此它适用于内部向量。

【讨论】:

为什么不使用std::vector 代替target @avakar 你是对的,你也应该使用 std::vector 作为目标 观察边缘情况 - 如果任何内部向量为空,则 &amp;*source[i].begin() 具有未定义的行为。但是由于该函数很可能需要float**,因此它很可能需要矩形数据,因此希望这就是提问者所拥有的。【参考方案3】:

您必须手动进行转换,通过使用两个循环将 vector&lt;vector&lt;float&gt; &gt; 的值填充到您的 float**

无论如何,您都必须分配内部float*

【讨论】:

以上是关于从 std::vector<std::vector<float>> 转换为 float**的主要内容,如果未能解决你的问题,请参考以下文章

std::vector 在内存中是啥样的?

如何从可变数量的 STL 向量创建变量的所有排列 [重复]

指针是不是有可能在没有任何数据副本的情况下由向量拥有?

从 std::vector<std::vector<float>> 转换为 float**

从 Go 中迭代`std::vector<std::string>`?

从 std::vector 创建 Eigen::Ref