글수 69
C 언어과정에 2차원 동적 배열 생성에 대한 글이 올라와서 C++에서는 vector를 이용하면 더 쉽게 하는 방법이 있어 글을 적습니다.
주의 : 다음은 기본자료형 int ,double 같은 경우에만 제대로 작동합니다.
C++에서는 표준라이브러리를 STL 이라고 부릅니다. STL이 표준이기 때문에 윈도우즈, 리눅스를 가리지 않고 작동하고 컴파일러를 가리지 않아 매우 호환성 있는 코드를 작성할 수 있습니다.
다음과 같이 작성하면 됩니다.
[code]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<vector<int> >vec2D;
int i, j ;
int count = 0;
vec2D.resize(10);
for(i=0; i < 10 ; i++)
{
vec2D[i].resize(10);
for (j = 0 ; j < 10 ; j++)
{
vec2D[i][j] = count++;
}
}
for(i=0; i < 10 ; i++)
{
for (j = 0 ; j < 10 ; j++)
{
cout<<vec2D[i][j] <<endl;
}
}
return 0;
}
[/code]
여기서 주의 한 부분의
[code] vector< vector<int> > [/code]
부분입니다.
이 부분을 다음과 같이 사용하게 되면
[code] vector< vector<int>>
>> 가 쉬프트 연산자 이므로 다른 의미를 가지게 됩니다.
따라서 > > 라고 분명히 뛰어써야 합니다.
[/code]
실제로 값을 넣어주기 전
resize를 호출하므로 불편할 수 있습니다. 그래서 다음과 같은 조금은 복작한 선언 방법을 이용할 수 도 있습니다.
[code]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int row = 10;
int col = 10;
vector< vector< int> > vec2D = vector<vector<int> >(row, vector<int>(col));
int i, j ;
int count = 0;
// vec2D.resize(10);
for(i=0; i < 10 ; i++)
{
// vec2D[i].resize(10);
for (j = 0 ; j < 10 ; j++)
{
vec2D[i][j] = count++;
}
}
for(i=0; i < 10 ; i++)
{
for (j = 0 ; j < 10 ; j++)
{
cout<<vec2D[i][j] <<endl;
}
}
return 0;
}
[/code]
당연한 말이지만 vector의 특성 때문에 메모리 해제 부분은 필요 없습니다.
다만 이 방법은 기본자료형 int, double 같은 경우에만 제대로 작동합니다. 유도형인 class 의 객체 생성에 이용하면 절대 안됩니다. 이 때는 smart pointer를 이용해야 되는데 스마트 포인터는 STL에 없으므로 실험해보지 못해 설명하지 못하겠내요.
주의 : 다음은 기본자료형 int ,double 같은 경우에만 제대로 작동합니다.
C++에서는 표준라이브러리를 STL 이라고 부릅니다. STL이 표준이기 때문에 윈도우즈, 리눅스를 가리지 않고 작동하고 컴파일러를 가리지 않아 매우 호환성 있는 코드를 작성할 수 있습니다.
다음과 같이 작성하면 됩니다.
[code]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<vector<int> >vec2D;
int i, j ;
int count = 0;
vec2D.resize(10);
for(i=0; i < 10 ; i++)
{
vec2D[i].resize(10);
for (j = 0 ; j < 10 ; j++)
{
vec2D[i][j] = count++;
}
}
for(i=0; i < 10 ; i++)
{
for (j = 0 ; j < 10 ; j++)
{
cout<<vec2D[i][j] <<endl;
}
}
return 0;
}
[/code]
여기서 주의 한 부분의
[code] vector< vector<int> > [/code]
부분입니다.
이 부분을 다음과 같이 사용하게 되면
[code] vector< vector<int>>
>> 가 쉬프트 연산자 이므로 다른 의미를 가지게 됩니다.
따라서 > > 라고 분명히 뛰어써야 합니다.
[/code]
실제로 값을 넣어주기 전
resize를 호출하므로 불편할 수 있습니다. 그래서 다음과 같은 조금은 복작한 선언 방법을 이용할 수 도 있습니다.
[code]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int row = 10;
int col = 10;
vector< vector< int> > vec2D = vector<vector<int> >(row, vector<int>(col));
int i, j ;
int count = 0;
// vec2D.resize(10);
for(i=0; i < 10 ; i++)
{
// vec2D[i].resize(10);
for (j = 0 ; j < 10 ; j++)
{
vec2D[i][j] = count++;
}
}
for(i=0; i < 10 ; i++)
{
for (j = 0 ; j < 10 ; j++)
{
cout<<vec2D[i][j] <<endl;
}
}
return 0;
}
[/code]
당연한 말이지만 vector의 특성 때문에 메모리 해제 부분은 필요 없습니다.
다만 이 방법은 기본자료형 int, double 같은 경우에만 제대로 작동합니다. 유도형인 class 의 객체 생성에 이용하면 절대 안됩니다. 이 때는 smart pointer를 이용해야 되는데 스마트 포인터는 STL에 없으므로 실험해보지 못해 설명하지 못하겠내요.
