본문 바로가기
  •                        自分に負けずやれば出来る
  • 自分を信じる
Computer/Programming Language

C++ STL vector 초기화 방법

by Divertome 2021. 5. 7.

일반적인 vector 선언

vector <int> v;
v.pushback(7);

위와 같은 형식으로 특정한 자료형을 동적으로 담을 수 있는 구조이다.
2차원 vector의 선언은 일반적인 vector의 형식과 동일하다. 다만 vector 안에 vector 자료형을 담는다고 생각하면 된다.
아래와 같은 형태로 선언을 할 수 있다.

2차원 vector의 선언과 활용

vector < vector <int> > v;

그렇다면 이렇게 선언된 2차원 vector에 pushback을 사용하려하면 어떻게 활용해야할까.

v.pushback(??????);

물음표 부분에 무엇을 넣어야 하는지가 헷갈릴텐데, 앞서 int형을 담는 vector에 int형을 넣어줬던 것과 동일하게,
vector <int> 자료형을 담는 vector이므로 vector <int> 자료형을 넣어줘야 한다.

vector < vector <int> > v;
vector <int> v2;

v.pushback(v2);

위와 같은 형태로 선언했던 자료형과 동일하게 넣어주면 된다.
vector의 원소는 배열에서 인덱스로 접근하는 것과 동일하게 v[0], v[1], v[2]... 와 같이 접근 가능하므로,
위의 2차원 vector도 v[0]으로 접근하게 된다면, 2차원 vector의 첫번째 원소인 v2에 접근 할 수 있다.
더 쉽게 말해서, v.pushback(v2)를 통해 2차원 vector v의 첫번째 인덱스(v[0]) 에 v2가 삽입 된 것이므로, 2차원 vector의 열에 해당하는 v2는 v[0].~~ 의 형식을 통해 접근 할 수 있다.
코드로 살펴보면

vector < vector <int> > v;
vector <int> v2;

v.pushback(v2);

v[0].pushback(7);
// v[0]에 담겨있는 v2 벡터에 7 입력

cout << v[0][0]; // 7 출력

cout << v.at(0).at(0); // 동일하게 7 출력

위와 같이 사용 가능하다.

추가로 조심해야 할 부분

vector < vector <int> > v;
vector <int> v2;

v.pushback(v2);

v2.pushback(7);

cout << v[0][0]; // 런타임 에러

2차원 vector인 v입장에서는 비어있는 v2를 입력받은 것이므로, 이후에 v2가 개별적으로 원소를 추가했고 안했고 여부에 상관없이,v[0][0]은 아직 할당받지 않은 값이므로 런타임 에러가 발생하게 된다.

2차원 vector를 쉽게 초기화하는 법

우선 일반적인 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로 초기화했음을 의미한다.