본문 바로가기

개발자/C++(Linux, Window)

[C++] STL 2차원 vector 정의 및 사용

반응형

1. 결론부터 말하자면 2차원 vector는 아래와 같이 사용하면 된다.

vector <int> v(10,0);

위와같이 선언하게 되면 해당 vector는 10개의 원소를 가지고 있고, 각 값은 0으로 초기화된다.

 

동일하게 2차원 vector에도 적용하면,

vector < vector <int> > v(10,vector <int>(10,0));

 

위와 같이 10개의 원소를 가지고 있고, 각 원소(vector)는 10개의 원소를 가지고 이 원소들은 0으로 초기화 된다.

글로 써보니 복잡해보이지만 v[0][0] ~ v[10][10] 까지 전부 0인 2차원 vector로 초기화했음을 의미한다.

 

 


2. 2차원 vector 잘못된 사용 사례

잘 선언했지만 컨테이너에 값을 잘못 넣은 사용 사례이다.

 

 

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

컴파일 에러가 발생한다.

해결로는 

 

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

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

 

반응형