2차원 벡터 선언 여러가지 방법

1. 원래의 vector

일반 vector는 보통 이렇게 사용한다.

	std::vector<int> arr;
	arr.push_back(1);
	arr.push_back(2);
	arr.push_back(3);
2차원 벡터 선언 여러가지 방법

순서대로 들어가게 된다.

2. 2차원 vector

하지만 2차원 배열은 어떻게 써야할까? 우선 자료형 안에 또하나의 vector를 선언 해준다.

	std::vector<std::vector<int>> arr2;

그리고 똑같이 넣어보려 했으나...

	std::vector<std::vector<int>> arr2;
	arr2.push_back(1);//에러!

컴파일 에러가 발생한다.

해결로는 

	std::vector<std::vector<int>> arr2;
	std::vector<int> arr;

별도의 int 자료형만 담는 vector를 만들어주고,

	std::vector<std::vector<int>> arr2;
	std::vector<int> arr;
	arr.push_back(1);
	arr.push_back(2);
	arr.push_back(3);

	arr2.push_back(arr);

위와 같이 입력해주면 된다.

2차원 벡터 선언 여러가지 방법

arr2 vector의 첫번째 요소로 arr 자체(1,2,3이 포함되어 있는)가 들어가게 된다.

그리고 접근하려고 한다면,

	std::vector<std::vector<int>> arr2;
	std::vector<int> arr;
	arr.push_back(1);
	arr.push_back(2);
	arr.push_back(3);

	arr2.push_back(arr);
    
        std::cout << arr2[0][0] << std::endl; //1출력!
   	std::cout << arr2[0][1] << std::endl; //2출력
	std::cout << arr2[0][2] << std::endl; //3출력

2차원배열과 같아진다. 주의 할점은 

	std::cout << arr2[0][3] << std::endl; //컴파일은 성공

비어 있는 요소의 컴파일은 성공되나 런타임 에러가 발생하게 된다.

2차원 벡터 선언 여러가지 방법

vector subscript out of range (벡터 첨자가 범위를 벗어남.)

다시 새로 추가해주려고 한다면,

	std::cout << arr2[0][0] << std::endl;
	std::cout << arr2[0][1] << std::endl;
	std::cout << arr2[0][2] << std::endl;


	arr2[0].push_back(6);

	std::cout << arr2[0][3] << std::endl;

arr2의 0번 인덱스에 6번을 넣어준다. 하지만 여기서 또 주의 할점은 

arr2의 0번 인덱스 vector에 넣어준다고 해서 원래 1,2,3값이 들어 있는 arr벡터에도 6이 들어가는 것은 아니다.

참조하고 있는게 아니라 이전에 그냥 arr의 vector요소들의 값을 복사해준것이기 때문이다.

2차원 벡터 선언 여러가지 방법
arr벡터에는 6 값은 없다.

3. vector의 초기화와 할당

이외에 vector을 처음 초기화 해줄때,

	std::vector<int> arr(10);

이렇게 선언해준다면 선언과 동시에 0개의 공간 0으로 초기화해준다.(진짜 배열같다)

2차원 벡터 선언 여러가지 방법

그리고 0이외에 선언과 동시에 같은 값으로 초기화도 가능하다.

	std::vector<int> arr(10,7);

이렇게 해준다면 10개의 공간을 7의 값으로 초기화 해준다.

2차원 벡터 선언 여러가지 방법

마찬가지로 2차원 vector 또한 

	std::vector<std::vector<int>> arr2(10);

이렇게 10개의 공간으로 미리 초기화가 가능하다.

2차원 벡터 선언 여러가지 방법

그리고 이제 각각의 10개의 공간들을 vector로 마찬가지로 초기화 해주고 싶다면,

	std::vector<std::vector<int>> arr2(10,std::vector<int>(5));

10개의 vector들을 5개씩 할당해준다. 값은 마찬가지로 기본 0이 들어가 있다.

2차원 벡터 선언 여러가지 방법
	std::vector<std::vector<int>> arr2(10,std::vector<int>(5,7));

마찬가지로 원하는 값으로 할당 가능하다.

2차원 벡터 선언 여러가지 방법