이 문제는 메모리 레이아웃입니다. 2 차원 C 배열 [4] [4]는 float [16] 배열과 같이 16 (4 * 4) 수레로 메모리에 있습니다. 그러나 벡터의 벡터는 다른 방법으로 위치합니다 : 이것은 float ** 동적 배열과 비슷하며 float * 유형의 모든 요소는 별도로 할당됩니다. 즉, 2 차원 배열의 포인터를 전달할 수는 없다는 의미입니다. 하지만 STL 알고리즘을 사용할 수 있습니다.
우선 std::vector
과 일반 C 배열은 모두 STL과 호환됩니다. 하나의 dimentional C 배열을 사용하여 std::vector
을 초기화해야한다고 가정 해 보겠습니다. 나는 이런 식으로 뭔가 작성해야합니다 : 그것은 새로운 벡터를 구성하고 testArray
에서 반복됩니다
float testArray[4]={0.99962944, -0.023989394, -0.012864082, -0.032067116};
vector<float> testVector(testArray,testArray+4);
을 testArray+4
에 (너무 포인터의)와 push_back
testVector
에 모든 요소 (그것은 포인터입니다). 그래서 가장 쉬운 방법은 당신이 원하는 것은 달성하기 위해 : 요소의 수의 2 개 차원 배열을하고 std::vector<std::vector<float>>
를 반환하는 함수를 작성하는 것이 좋습니다 그래서
이
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 값이 변경 될 수 있습니다. 예를 들어 :
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<float>
의
std::vector
당신이 개 어두운 배열을 포함합니다.
편집
는 당신이 경우이 기능처럼이 모든 유형의 배열을 다시 할 수 있습니다뿐만 아니라 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
글쎄, 루프에서 복사해야합니다. 직접 변환 할 수 없습니다. –