관리 메뉴

기억을 위한 기록들

[CPP/STL] vector로 2차원배열 사용하기 본문

C & CPP/STL(Standart Template Library

[CPP/STL] vector로 2차원배열 사용하기

에드윈H 2021. 4. 19. 15:05

1. 원래의 vector

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

 

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

 

순서대로 들어가게 된다.

 

 

 

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);

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

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; //컴파일은 성공

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

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요소들의 값을 복사해준것이기 때문이다.

 

arr벡터에는 6 값은 없다.

 

 

 

3. vector의 초기화와 할당

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

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

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

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

 

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

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

마찬가지로 2차원 vector 또한 

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

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

 

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

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

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

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

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