using 2D array in C++

C++ 에서 함수에 매개변수로 2차원 배열을 어떻게 던져주어야 하는 지에 대해서 다뤄보고자 한다. 사용하다보면 사용상 헷갈려서 정리 차원에서 다루어 본다. 크게 pointer 사용법, vector 사용법로 구분이 가능하다.

pointer 배열 방식 사용

정적 배열은 C에서 사용하는 방식과 거의 유사하다. int 배열을 엑세스하기 위해서는 거의 필수적으로 포인터를 넘겨야 한다. 방법은 아래 세 가지 정도가 가장 많이 쓰인다.

  1. 2차원의 고정배열을 사용하는 방법

    • 고정된 배열을 가지고 있다면 가장 편하게 사용할 수 있는 방법이다. 실제 데이터도 정적인 함수 내의 stack만을 사용하는 특징이 있다.
    • 단점 : 다만 컴파일 타임에서 row, col 각 차원의 크기가 고정되어 버린다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const int CONST_ROW = 3;
    const int CONST_COL = 2;
    void func(int arr[CONST_ROW][CONST_COL]){
    int val = 0;
    for (int i = 0; i < CONST_COL; i++)
    for (int j = 0; j < CONST_COL; j++)
    arr[i][j] = val++;
    }
    int arr[CONST_ROW][CONST_COL];
    func(arr);
  2. 고정배열의 포인터를 활용하는 방법

    • row의 개수를 고정시켜서 활동하는 방법이다. 실제 데이터는 new를 사용하여 매핑시켜야 하므로 heap 메모리에 정적으로 쌓인다. row 한 축에 대해서만 컴파일 타임에서 결정되고, col축 데이터는 런타임에서 크기가 결정된다.
    • 단점 : delete를 사용하여 추가적인 메모리 누수 방지를 고려해야 한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const int CONST_ROW = 3;
    void func2(int *arr[CONST_ROW], int num_col){
    int val = 0;
    for (int i = 0; i < CONST_ROW; i++)
    for (int j = 0; j < num_col; j++)
    arr[i][j] = val++;
    }
    int *arr[CONST_ROW];
    for (int i=0; i < CONST_ROW; i++)
    arr[i] = new int(CONST_COL);
    func2(arr, CONST_COL);
  3. 1차원의 배열을 2차원의 배열처럼 활용하는 방법

    • 1차원의 배열을 바로 2차원의 배열처럼 매핑시켜서 활용하는 방법이다. 메모리를 잡을 때는 정적, 동적 양쪽 모두 활용하는 것이 가능하다.
    • 장점 : row, col 양 차원 모두에 대해서 런타임에서 크기를 결정 가능하다.
    • 단점 : 다만 각 데이터에 엑세스할 때 arr[i*num_row + j]와 같은 식으로 사용해야 하는 점에서 직관적이지 못한 단점이 있다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void func3(int *arr, int num_row, int num_col){
    int val = 0;
    for (int i = 0; i < num_row; i++)
    for (int j = 0; j < num_col; j++)
    arr[i*num_row + j] = val++;
    }
    int num_col = 3;
    int num_row = 2;
    int arr_static[CONST_ROW*CONST_COL];
    int *arr_dynamic = new int(num_col*num_row);
    func3(arr_static, CONST_COL);
    func3(arr_dynamic, CONST_COL);

vector 배열 방식 사용

동적 배열을 가장 간단한 방법은 vector를 사용하는 방법이다. vector< vector<type> >과 같은 식으로 사용하면 arr[i][j]와 같은 방법으로 쉽게 엑세스가 가능하다. 마찬가지로 3차원, 4차원 배열에도 같은 방식으로 응용이 가능하다. 정적 배열에서 문제가 있었던 컴파일 타임에서 배열 크기가 결정된다거나 엑세스할 때 비직관적인 방법으로 호출을 한다던가 하는 문제가 전혀 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void func(vector<vector<int> > &arr){
// initialization
// 0 1 2
// 3 4 5
int val = 0;
for (int i = 0; i < arr.size(); i++)
for (int j = 0; j < arr[i].size(); j++)
arr[i][j] = val++;
// print values
for (vector<int> vec : arr) {
for (int n : vec)
cout << n << " ";
cout << endl;
}
}
vector<vector<int> > arr(3, vector<int>(2, 0));
func(arr);

vector를 사용한 C++의 이차원 배열 사용

C++에서 정적인 배열로 이차원 배열 구현

Share Comments