반응형
이번 글을 통해 배워갈 내용
- C++로 동적으로 2중배열을 사용하는 방법
C++에서 배열을 컴파일 전에 코딩으로 크기 정하는건 간단합니다.
int myArray [5] = { 1, 2, 3, 4, 5 };
위에 방법처럼 선언 및 정의를 해주면 됩니다.
그렇다면 런타임(프로그램 실행 중)에는 배열을 어떻게 관리해야 될까요?
저는 스택오버플로우에서 포인터를 통해 해답을 찾았습니다.
int** arr = new int* [x]; //x 는 행의 갯수
for(int i = 0; i < x; i++)
arr[i] = new int[y]; //y는 열의 갯수
// 코드 참조 스택오버플로우
이중으로 포인터를 사용하였으며
포인터 0에 1, 2, 3, 이런식으로 배열을 넣고
포인터 1에 동일하게 넣어서
늘려가는 방식입니다.
스택오버플로우에서는
위에 방법과 함께
메모리를 더욱더 효율적으로 쓰는 두번째 방법을 제시합니다
int *ary = new int[SizeX*SizeY]
ary[i*SizeY+j] // ary[i][j]
하지만 위에 방법은 가독성이 떨어져서 CPU 효율성을 높혀야 하는 경우가 아니라면
저는 첫번째 방법을 씁니다.
아래 코드는 제가 첫번째 방법으로
2중 배열을 선언하고 사용한 전체 코드입니다.
#include <iostream>
using namespace std;
class CMy2DArray
{
private:
int ** my2DArray;
int sizeX;
int sizeY;
public:
CMy2DArray();
~CMy2DArray();
void assignArraySize(int size);
void fillArray();
void displayArray();
};
//생성자
CMy2DArray::CMy2DArray()
{
}
// 소멸자
CMy2DArray::~CMy2DArray()
{
// 메모리 관리
for(int i = 0; i < sizeY; ++i) {
delete [] my2DArray[i];
}
delete [] my2DArray;
}
// 배열 생성성
void CMy2DArray::assignArraySize(int size)
{
sizeX = size;
sizeY = size;
my2DArray = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
my2DArray[i] = new int[sizeX];
}
}
void CMy2DArray::fillArray()
{
for(int i=0;i<sizeY;i++)
{
for(int j=0;j<sizeX;j++)
{
my2DArray[i][j] = i+j;
}
}
}
void CMy2DArray::displayArray()
{
for(int i=0;i<sizeY;i++)
{
for(int j=0;j<sizeX;j++)
{
cout<<my2DArray[i][j] << " ";
}
cout << endl;
}
}
int main()
{
int n;
cin >> n;
CMy2DArray* my2DArray = new CMy2DArray();
my2DArray->assignArraySize(n);
my2DArray->fillArray();
my2DArray->displayArray();
cout<<"Hello World";
return 0;
}
입력
3
결과
0 1 2
1 2 3
2 3 4
Hello World
오늘도 즐거운 코딩하시길 바랍니다 ~ :)
참조 및 인용
https://www.guru99.com/cpp-dynamic-array.html
https://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new
C++ Primer
반응형
'C++ > C++ 기타' 카테고리의 다른 글
C++ 아스키 코드 스트링 문자 뒤집기 (1) | 2021.07.03 |
---|---|
C++ 아스키 코드 영어 단어 길이 구해보기 (1) | 2021.07.03 |
C++ 동적으로 배열 크기를 늘리는 세가지 방법 (1) | 2021.06.21 |
배열을 함수에 인자로 보낼때 알아야 하는 한가지 (1) | 2021.06.15 |
과학적으로 배우는 pass by value, pass by reference, pass by address (1) | 2021.06.15 |