본문 바로가기

프로그래밍/알고리즘/C++

[C++ STL] 동적 2차원 배열 사용법(vector)

//int arr[6][5] 배열 선언. 0으로 초기화

vector<vector<int> > arr(6, vector<int>(5, 0));

 

// 삽입

int serial = 0;

for (int i = 0; i < 6; i++)

    for (int j = 0; j < 5; j++)

        arr[i][j] = serial++;

 

// 출력

for (vector<int> vec : arr) {

    for (int n : vec)

        printf("%3d ", n);

    cout << endl;

}




표준출력:

  0   1   2   3   4 

  5   6   7   8   9 

 10  11  12  13  14 

 15  16  17  18  19 

 20  21  22  23  24 

 25  26  27  28  29 


코드 설명

vector<vector<int> > arr(6, vector<int>(5, 0));

ㄴvector<int>형 벡터 6개(가로 6줄)를 할당 한다는 뜻입니다.


vector<vector<int> > arr(6, vector<int>(5, 0));

ㄴ모든 가로 줄은 5개 짜리 0으로 초기화 된 익명의 int 벡터 배열을 생성하여 초기값으로 넣게 됩니다.


※for(머시기:배열) 이런식의 ranged for loop는 C++11 버전 이상부터 지원합니다.



선언
일단 자료형은 정수형 벡터를 자료형으로 가지는 벡터 입니다.
사용은 물론 #include <vector>해서 헤더 파일을 불러 와야 하고
using namespace std; 해서 std::vector를 vector로 바로 쓸 수 있도록 합니다.

생성
vector 생성자는 첫 인자로 할당할 배열의 사이즈, 두번째 인자로 초기값을 보통 씁니다.
즉, vector<int> arr(5,0) 이렇게 쓰면 5개짜리 배열을 생성하고 초기값으로 0을 넣는다는 뜻입니다.
2차원 배열로 생성하는 경우

vector<vector<int> > arr(6, vector<int>(5, 0));

이렇게 되는데, 바깥 벡터는 vector<int>를 자료형으로 갖는 벡터이구요

안쪽 벡터는 int를 자료형으로 갖는 벡터입니다. <int> >부분 시프트 연산자 >>랑 구분해 주기 위해 중간에 공백을 꼭 넣어주세요.


사용

벡터는 연속된 공간에 할당하는 자료형이기 때문에 일반 배열처럼 사용해도 됩니다.

맨 위 코드에 값 삽입 부분을 보시면 됩니다.



C++11 이상 배열 생성 초간편 방법

vector<vector<int> > arr({

    vector<int>( { 0, 1, 2 }),

    vector<int>( { 3, 7, 9, 11 }),

    vector<int>( { 4, 10, 14, 15 }),

    vector<int>( { 0, 4, 5, 6, 7 }),

    vector<int>( { 6, 7, 8, 10, 12 }),

    vector<int>( { 0, 2, 14, 15 }),

    vector<int>( { 3, 14, 15 }),

    vector<int>( { 4, 5, 7, 14, 15 }),

    vector<int>( { 1, 2, 3, 4, 5 }),

    vector<int>( { 3, 4, 5, 9, 13 })

});