我有
float viewerMatrix[4][4] =
{
{0.99962944, -0.023989394, -0.012864082, -0.032067116},
{0.02354476, 0.9991557, -0.033667795, -0.0060634422},
{0.013660891, 0.033352438, 0.99935031, 0.047027141},
{ 0, 0, 0, 1}
};
我想将它存储在一个类中,并且会有更多这些因此我认为将它放在vector
中是一个好主意。我需要将此数组转换为vector<vector<float>>
,然后将push_back
转换为vector< vector<vector<float>> >
类型的类成员。
那么,我可以用该数组初始化vector<vector<float>>
吗?
我尝试了什么
vector<vector<float>> floatVector (viewerMatrix);
不起作用。
error: invalid conversion from ‘float (*)[4]’ to ‘std::vector<std::vector<float> >::size_type {aka long unsigned int}’ [-fpermissive]
答案 0 :(得分:1)
您不能拥有vector
数组。如果你真的需要将输出存储在vector
中,我会说类似
class Matrix
{
float m[4][4];
};
然后复制你的东西并将其推入vector
。
答案 1 :(得分:1)
执行此操作的问题是内存布局:二维C数组[4] [4]位于内存中,因为16(4 * 4)浮点数类似于float [16]数组。但是矢量位于其他方式:它更像浮动**动态数组,并且float *类型的每个元素都是单独分配的。这意味着你不能只传递你的二维数组的指针并且是好的。但是你可以使用STL算法。
首先,std::vector
和普通C数组都兼容STL。假设您需要使用一维C数组初始化std::vector
。我必须写这样的东西:
float testArray[4]={0.99962944, -0.023989394, -0.012864082, -0.032067116};
vector<float> testVector(testArray,testArray+4);
它将构造一个新的向量并从testArray
(它是一个指针)迭代到testArray+4
(它也是指针)和push_back
每个元素到testVector
。因此,实现您想要的最简单方法是:
vector<vector<float>> floatVector{
{viewerMatrix[0],viewerMatrix[0]+4},
{viewerMatrix[1],viewerMatrix[1]+4},
{viewerMatrix[2],viewerMatrix[2]+4},
{viewerMatrix[3],viewerMatrix[3]+4},
};
当然,可以更改维度中的4个值,因此最好创建一个函数,该函数采用任意数量元素的二维数组并返回std::vector<std::vector<float>>
。例如:
template<size_t M,size_t N>
std::vector<std::vector<float>> initVectorWithTwoDimArray(float (&ar)[M][N]){
std::vector<std::vector<float>> res;
res.reserve(M);
for(auto i=0;i<M;++i){
res.emplace_back(ar[i],ar[i]+N);
}
return std::move(res);
}
float viewerMatrix[4][4] =
{
{0.99962944, -0.023989394, -0.012864082, -0.032067116},
{0.02354476, 0.9991557, -0.033667795, -0.0060634422},
{0.013660891, 0.033352438, 0.99935031, 0.047027141},
{ 0, 0, 0, 1}
};
auto floatVector=initVectorWithTwoDimArray(viewerMatrix);
现在floatVector
std::vector
std::vector<float>
包含您的两个昏暗数组。
修改强>
如果您喜欢此功能,可以使用任何类型的数组重新创建它,而不仅仅是float
:
template<class T,size_t M,size_t N>
std::vector<std::vector<T>> initVectorWithTwoDimArray(T (&ar)[M][N]){
std::vector<std::vector<T>> res;
res.reserve(M);
for(auto i=0;i<M;++i){
res.emplace_back(ar[i],ar[i]+N);
}
return std::move(res);
}
此版本适用于任何类型的数组:int
,double
,AnyYourClass
等。用法相同:
float viewerMatrix[4][4] =
{
{0.99962944, -0.023989394, -0.012864082, -0.032067116},
{0.02354476, 0.9991557, -0.033667795, -0.0060634422},
{0.013660891, 0.033352438, 0.99935031, 0.047027141},
{ 0, 0, 0, 1}
};
auto floatVector=initVectorWithTwoDimArray(viewerMatrix);