用多维数组初始化c ++多维向量?

时间:2016-06-19 15:59:57

标签: c++ arrays vector

我有

  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]

2 个答案:

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

此版本适用于任何类型的数组:intdoubleAnyYourClass等。用法相同:

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);