2012-05-07 3 views
0

3x4 행렬의 미확인 수를 필요로한다고 가정합니다. (또는 다른 고정 m-by-n 차원 행렬의 시퀀스) 첫 번째 생각은이 행렬을 std::vector에 저장하는 것입니다. 각 행렬은 그 자체가 std::vector<std::vector<double> >입니다. std::vector::reserve()을 사용하여이 행렬의 수 (예 : x)의 공간을 사전 할당하려면 어떻게해야합니까? 내가 두 가지 차원을 알고 있기 때문에, 나는이 블록의 크기를 x 시간으로 할 수 있어야한다. "블록"을 보존하는 C++ 3D 벡터

나는 1 차원 std::vector에서이 객체를 구현하는 방법을 알고,하지만 난, 3 차원 std::vector에서 작업을 수행하는 방법을 알고 싶습니다 더 std::vector 클래스를 사용하는 방법을 학습하는 것보다 다른 이유가있는 경우.

+0

'보존'과 같은 것은 없습니다. –

+0

Kerrek SB가 말한 것처럼'reserve()','preserve'가 존재하지 않는다는 것을 의미합니다. – EdChum

+0

죄송합니다, 예, "보존"을 의미하지 않습니다. :) – synaptik

답변

0

더 나은 접근 방법은 클래스 인터페이스를 제공하고 전체 매트릭스에 대해 단일 선형 메모리 블록을 사용하는 것입니다. 그런 다음 적절한 크기의 내부 배열 (크기가 크기의 일부인 경우) 또는 인덱싱 (pos = row*cols + col)을 제공하여 std::vector<int>의 단일 배열로 다양한 방법으로 인터페이스를 구현할 수 있습니다.

std::vector< std::vector<int> > 접근법에서 외부 벡터는 내부 벡터를 저장하기 위해 메모리를 할당하고 각 벡터는 내부 요소를 보유하기 위해 메모리를 할당합니다. 인

int **array = new int*[ N ]; 
for (int i = 0; i < N; ++i) 
    array[i] = new int[ M ]; 

:

[ 0 ] -------> [ 0, 1, 2, ... ] 
[---] 
[ 1 ] -------> [ 0, 1, 2, ... ] 
[ . ] 
[ . ] 

또는 메모리의 기본적 N + 1 개 개별 블록을 원료 포인터를 사용하면, 메모리로의 레이아웃과 유사하다.

1

벡터 벡터로 행렬을 저장하는 것은 꽤 비효율적 일 것입니다.하지만 반드시 수행해야합니다. 공간을 예약 항상 같은입니다 :베이스 유형에 대한

typedef std::vector<std::vector<int>> matrix_type; 

std::vector<matrix_type> collection; 

collection.reserve(100); // set capacity for 100 "matrices" 

// make 10 4x3-matrices; `collection` won't reallocate 
collection.resize(10, matrix_type(4, std::vector<int>(3))); 

당신이 하나의 m * n 요소의 벡터와 진보에 액세스 그것을 가지고 더 잘 할 수있는 (I, J) 즉 요소 일 것 위치는 i * n + j입니다. 각 벡터 자체는 동적 컨테이너이므로 많은 동적 할당을 여기 저기에두고 싶지 않을 것입니다.

같은 맥락에서

, 위의 reserve 호출은 아마 그것은 단지 내부 벡터의 회계 데이터 (벡터 당 보통 세 단어, 즉 300 개 단어)에 대한 메모리를 예약대로 생각하지 않으며, 하지에 대한 실제 데이터.

그런 점에서을 매트릭스 유형으로 간주하고 (스트라이드에서 액세스 할 수 있습니다.); 이제 실제로 실제 행렬에 대한 공간을 미리 예약 -하지만 mn 이제 컴파일 시간 상수가 있어야합니다.

+0

고마워. 이것은 매우 도움이됩니다. 나는 매트릭스 형으로'std :: array'를 사용하는 것과 매우 흡사하다. – synaptik