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));
마찬가지로 원하는 값으로 할당 가능하다.
'개발자 > C++(Linux, Window)' 카테고리의 다른 글
C++ 주요 STL 한 방 정리 (Container, Adapter 등등) (0) | 2021.09.20 |
---|---|
C++ : 범위 기반 for 반복문 (0) | 2021.09.20 |
[VSCode] macOS에서 Visual Studio Code로 C/C++ 코딩하기(2) - 디버깅을 위한 tasks.json, launch.json 설정 (0) | 2021.07.25 |
Wrapper 클래스 (0) | 2021.03.24 |
2D 배열의 관련 연산 최적화 (0) | 2020.10.07 |