Проблема с этим - это макет памяти: двухмерный массив C [4] [4] расположен в памяти, так как 16 (4 * 4) плавают подобно массиву float [16]. Но вектор вектора, расположенный по-другому: он более похож на динамический массив float **, и каждый элемент типа float * выделяется отдельно. Это означает, что вы не можете просто передать указатель на свой двумерный массив и быть хорошим. Но вы можете использовать алгоритмы STL.
Прежде всего std::vector
и простой массив C, оба являются совместимыми с STL. Предположим, вам нужно инициализировать std::vector
с одним массивным массивом C. Я должен написать что-то вроде этого:
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);
Зачем вам это нужно, чтобы инициализировать его из промежуточного массива? –
Это результат другого метода, который я не контролирую. Он выводит 2-мерный массив, и я хотел сохранить этот результат в своем классе. – 5argon
Ну, вам нужно скопировать в цикле, тогда нет прямого преобразования. –