2016-06-19 4 views
2

는 내가 수업 시간에이를 저장 원했고, 그래서 vector에 좋은 생각을한다 퍼팅 생각이의 더 많은있을 것다차원 배열로 C++ 다차원 벡터를 초기화 하시겠습니까?

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<float>>으로 변환 한 후 push_backvector< 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

왜 중간 배열에서 초기화 할 필요가 있습니까? –

+0

내가 제어 할 수없는 다른 방법의 출력입니다. 2 차원 배열을 출력하고이 결과를 내 자신의 클래스에 저장하려고했습니다. – 5argon

+0

글쎄, 루프에서 복사해야합니다. 직접 변환 할 수 없습니다. –

답변

1

이 문제는 메모리 레이아웃입니다. 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_backtestVector에 모든 요소 (그것은 포인터입니다). 그래서 가장 쉬운 방법은 당신이 원하는 것은 달성하기 위해 : 요소의 수의 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); 

지금 floatVectorstd::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); 
1

배열의 vector을 가질 수 없습니다. 당신이 정말로 vector에 출력을 저장해야하는 경우, 나는 이상 물건을 복사하고 vector에 밀어 넣습니다 다음

class Matrix 
{ 
float m[4][4]; 
}; 

과 같은 일을 말할 것입니다.

+1

왜'std :: array , 4> m;'? –

+0

나는이 경우에 C 스타일 어레이를 선호한다. 내가 아는 바로는 컨테이너 사용시 성능 저하가 없어야합니다. –

관련 문제