从 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<std::vector<float>>
类型的变量中有值。
是否可以在不分配临时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<>
s,但您需要重新创建外部。 std::vector<>
保证其成员的线性存储(意味着它与 C 数组兼容),因此它适用于内部向量。
【讨论】:
为什么不使用std::vector
代替target
?
@avakar 你是对的,你也应该使用 std::vector 作为目标
观察边缘情况 - 如果任何内部向量为空,则 &*source[i].begin()
具有未定义的行为。但是由于该函数很可能需要float**
,因此它很可能需要矩形数据,因此希望这就是提问者所拥有的。【参考方案3】:
您必须手动进行转换,通过使用两个循环将 vector<vector<float> >
的值填充到您的 float**
。
无论如何,您都必须分配内部float*
。
【讨论】:
以上是关于从 std::vector<std::vector<float>> 转换为 float**的主要内容,如果未能解决你的问题,请参考以下文章
从 std::vector<std::vector<float>> 转换为 float**