2009-05-05 4 views
28

하이 C++ 다차원 벡터

방법

a[0][1]=98; 
a[0][2]=95; 
a[0][3]=99; 
a[0][4]=910; 

a[1][0]=98; 
a[1][1]=989; 
a[1][2]=981; 
a[1][3]=987; 

방법 벡터에서 동일한 작업을 수행 차원 배열과 같은 곳에서 2D 벡터를 만들 수? 미리 감사드립니다. 시스템이 모든 내부 벡터는 크기가 같고 보장되지 않으므로 성장 행렬이 사용

+0

중복 :? _stackoverflow.com/questions/741190/multi-dimensional-array-c – lothar

+5

나는 그것이 _exact_ 중복이라고 생각하지 않습니다. 이 질문은 벡터의 벡터를 사용하고 원시 메모리를 사용하지 않는 것에 대한 내용입니다. –

답변

31

vector<vector<int> > a;

+2

행과 열을 어떻게 정의합니까? – Rosenthal

+0

결정할 때까지. – Ari

28
std::vector< std::vector<int> > a; // as Ari pointed 

, 복잡해질 수 있습니다. 두 번째 차원에서 성장할 때마다 모든 벡터를 명시 적으로 늘려야합니다.

// grow twice in the first dimension 
a.push_back(vector<int>()); 
a.push_back(vector<int>()); 

a[0].push_back(5); // a[0].size() == 1, a[1].size()==0 

괜찮 으면 (사실 매트릭스가 아니라 벡터의 벡터가 아닙니다.) 괜찮을 것입니다. 그렇지 않으면 모든 벡터에서 두 번째 차원을 안정적으로 유지하는 데 특별한주의를 기울여야합니다.

고정 크기의 행렬을 사용하려는 경우 클래스에 캡슐화하고 double 배열 구문을 제공하는 대신 operator()를 재정의하는 것을 고려해야합니다. 이 here

+1

FAQ Lite 링크는 현재 [here] (http://www.parashift.com/c++-faq/matrix-array-of-array.html)입니다. – sumodds

13
std::vector< std::vector<int> > a; 

    //m * n is the size of the matrix 

    int m = 2, n = 4; 
    //Grow rows by m 
    a.resize(m); 
    for(int i = 0 ; i < m ; ++i) 
    { 
     //Grow Columns by n 
     a[i].resize(n); 
    } 
    //Now you have matrix m*n with default values 

    //you can use the Matrix, now 
    a[1][0]=98; 
    a[1][1]=989; 
    a[1][2]=981; 
    a[1][3]=987; 

//OR 
for(i = 0 ; i < m ; ++i) 
{ 
    for(int j = 0 ; j < n ; ++j) 
    {  //modify matrix 
     int x = a[i][j]; 
    } 

} 
0

dribeas '제안에 관한 C++ FAQ를 읽고 정말 길을 가야하는 것입니다.

operator() 경로로 이동하려는 이유를 설명하면 데이터가 희박한 경우 내부적으로 공간을 절약하기 위해 다르게 배치 할 수 있으며 operator()는 내부 구현 문제를 다음과 같이 숨 깁니다. 최종 사용자가보다 나은 캡슐화를 제공하고 인터페이스를 깨지 않고 나중에 내부 레이아웃의 공간 또는 속도를 향상시킬 수 있습니다.

6

에 벡터를 사용하는이없는 경우 Boost.Multi_array을 시도 할 수 있습니다. 간단한 예를 들면 link입니다.

0

아리가 지적한대로 벡터 < 벡터 < int >>가 올바른 방법입니다.

그 외에도 복잡한 STL 구조는 어색하고 혼란스러워지기 때문에 그러한 경우에는 항상 내부 벡터를 실제로 클래스로 래핑하는 것을 고려합니다.

0

2 차원 벡터를 사용하려면 다음 방법을 사용하십시오.

int rows, columns;   

// . . . 

vector < vector <int> > Matrix(rows, vector<int>(columns,0)); 

            Or 

vector < vector <int> > Matrix; 
Matrix.assign(rows, vector <int>(columns, 0)); 

// Do your stuff here... 

이 * 컬럼 크기 행의 행렬을 생성하고 우리 생성자 즉 벡터 < INT> (열 번째 인수로서 (0) 0을 통과하기 때문에 제로로 초기화한다, 0).