[C++] 2차원 배열과 벡터의 동적 할당

2023. 9. 6. 18:00프로그래밍 언어/C++\C

1차원 배열의 동적 할당

new [] 연산자를 사용하여 동적으로 할당하고, delete [] 연산자를 사용하여 메모리를 해제한다.

// 동적으로 메모리 할당
데이터_타입* 포인터_이름 = new 데이터_타입[크기];

// 예시: int형 크기가 n인 동적 배열 할당
int* numbers = new int[n];

// 메모리 해제 (반드시 필요한 경우에만 사용)
delete[] numbers;

동적으로 할당된 배열은 필요에 따라 크기를 조절할 수 있다는 장점이 있다.

// 초기 크기로 동적 배열 생성
int initialSize = 5;
int* arr = new int[initialSize];

// 현재 크기 저장
int currentSize = initialSize;
// 새로운 크기 설정
int newSize = 10;

if (newSize > currentSize) {
    // 더 큰 크기가 필요한 경우
    // 새로운 메모리 할당
    int* newArr = new int[newSize];

    // 기존 데이터 복사
    for (int i = 0; i < currentSize; ++i) {
        newArr[i] = arr[i];
    }

    // 기존 메모리 해제
    delete[] arr;
    // 포인터 갱신
    arr = newArr;
    // 현재 크기 업데이트
    currentSize = newSize;
}

2차원 배열 동적 할당

행과 열을 먼저 지정하고 메모리를 할당할 수 있다. 

// 행 크기가 m이고 열 크기가 n인 2차원 동적 배열 할당
int** matrix = new int*[m];
for (int i = 0; i < m; ++i) {
    matrix[i] = new int[n];
}

 // 행 크기가 m이고 열 크기가 n인 2차원 동적 배열 해제
 for (int i = 0; i < m; ++i) {
     delete[] matrix[i];
 }
 delete[] matrix;

주의할 점은 메모리 해제 시 반드시 할당된 순서와 반대로 해제해야 한다는 것이다. 열의 크기는 일정하지만 행의 크기는 다르게 선언할 수 있다. 이를 가변 길이 행렬이라고도 한다.

데이터_타입** 배열_이름 = new 데이터_타입*[행_수];
for (int i = 0; i < 행_수; ++i) {
    배열_이름[i] = new 데이터_타입[열_크기];
}

2차원 벡터 생성

// 크기가 MxN인 2차원 벡터 생성
vector<vector<int>> matrix(M, vector<int>(N));

위의 방식으로 2차원 벡터를 생성할 수 있다. 이때 행과 열의 크기를 모두 지정할 수도 있고 행의 크기만 지정할 수도 있다.

행의 크기만 지정하는 방법을 보자.

int rows = 3;
vector<vector<int>> matrix(rows);

// 각 행에 대해 열의 크기를 따로 지정
for (int i = 0; i < rows; ++i) {
    int cols = i + 2; // 예시로 각 행마다 다른 열 크기를 설정
    matrix[i].resize(cols);
}

 // 또는 초기화된 값으로 각 행의 열 크기 설정
 for (int i = 0; i < rows; ++i) {
     int cols = initial_values[i].size(); // 초기값이 있는 경우 해당 행의 초기값 개수로 열 크기 설정
     matrix[i].resize(cols);
     for (int j = 0; j < cols; ++j) {
         matrix[i][j] = initial_values[i][j]; // 초기값 할당
     }
 }