벡터는 프로그램이 실행되는 동안에도 길이가 자라거나 줄어들 수 있는 배열(가변배열) 이라고 볼 수 있다. 배열과 마찬가지로 기본 자료형은 가지고, 그 타입의 데이터 모음을 저장한다. 사용 방법에 있어서 배열과 다른점은 크게 두 가지 밖에 없다. 먼저, 벡터 타입에 대한 문법, 그리고 선언를 하는 방식이다.
벡터로 int형의 선언은 vector<int> v
와 같이 한다. vector<Base_Type>
라는 표기방식은 템플릿 클래스이다. 즉, <Base_Type>
의 자리에 어떠한 타입의 데이터를 넣을 수도 있다는 말이다. 간단히 예를 들면, vector<string> v, vector<stack> v
와 같은 형태로 활용가능하다는 뜻이다.
벡터를 선언하는 방법은 여러 가지 형태가 있을 수 있는데, 가장 기본적인 형태는 vector<Base_Type> v이다. 이 경우에는 크기가 0인 벡터를 선언만 하는 형태이므로 따로 공간을 할당해주거나, 데이터를 push_back()함수를 통해서 추가해주어야 한다.
vector<int> v;
push_back(1);
push_back(2);
push_back(3);
v[0] | v[1] | v[2] |
---|---|---|
1 | 2 | 3 |
두 번째 방법으로, 선언과 동시에 벡터의 크기를 지정할 수 있다. 이때는 벡터에 해당 크기만큼의 빈 공간이 할당된다. 따로 초기화 해주지 않아도 기본값은 0으로 초기화 된다.
vector<int> v(3); // int v[3]; 과 동일
v[0] | v[1] | v[2] |
---|---|---|
0 | 0 | 0 |
알고리즘 문제 풀이를 하면서 이 방법을 주로 사용하는 경우가 많다. 왜냐하면 문제에서 보통 N이 주어지고 그만큼의 입력을 받는 형태가 많기 때문이다.
int N;
cin >> N;
vector<int> v(N);
◼︎ PITFALL: Using square brackets in definition
벡터의 선언에서 []
기호를 사용하는 것은 어떤 의미를 가질까? 처음에 이 부분이 약간 헷갈려서 실수를 한적이 있다. vector v(n)과 같이 선언하면 크기가 n인 벡터를 선언한 것이다. 하지만 vector v[n]으로 선언하면 int형 벡터를 n개 만큼 선언한 것이다.
vector<int> v1(3); // 크기가 3인 벡터 선언
vector<int> v2[3]; // 벡터를 3개 선언
for(int i=0; i<v1.size(); i++) // 정상 출력
cout << v1[i];
for(int i=0; i<v2.size(); i++) // 에러 발생
cout << v2[i];
v[0] | v[1] | v[2] |
---|---|---|
0 | 0 | 0 |
이것은 vector<int> v(3);
으로 선언했을 때의 초기 모습이다.
v[0] | v[1] | v[2] |
---|---|---|
vector<int> | vector<int> | vector<int> |
반면에, vector<int> v[3];
으로 선언하면 vector의 레퍼런스(참조값)를 담고있다.
✓ 그래프의 인접리스트 표현에서도 이런 방식이 사용된다.
참고자료: https://stackoverflow.com/questions/26073735/square-brackets-in-vectors
[]
벡터는 배열과 마찬가지로 []
를 사용하여 해당 인덱스에 접근할 수 있다. 배열과 마찬가지로 인덱스는 0부터 시작한다. 단, 배열과 다르게 할당되지 않은 영역에 접근할 수 없다.
◼︎ PITFALL: Using square brackets beyond the vector size
만약 v가 벡터이고 i 가 v.size()보다 크거나 같다면, v[i] 원소는 아직 존재하지 않으며, push_back 메소드를 통해 i를 포함한 영역을 만들어줄 필요가 있다. 이때 v.size()보다 크거나 같은 i에 대해서 v[i]의 값을 변경하려고 한다면, 에러메시지는 발생하지 않으나, 프로그램이 특정 지점에서 예상치 못하게 실행될 수 있다.
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> v;
cout << "Enter a list of positive numbers.\n"
<< "Place a negative number at the end.\n";
int next;
cin >> next;
while (next > 0) {
v.push_back(next);
cout << next << " added. ";
cout << "v.size() = " << v.size() << endl;
cin >> next;
}
cout << "You entered:\n";
for(unsigned int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
return 0;
}
[실행 결과]
Enter a list of positive numbers.
Place a negative number at the end.
2 4 6 8 -1 // 입력
2 added. v.size() = 1
4 added. v.size() = 2
6 added. v.size() = 3
8 added. v.size() = 4
You entered:
2 4 6 8