1) vector의 크기 지정하지 않고 생성
vector<int> v;` // 벡터 v 생성
2) vector의 크기 지정하고 생성
vector<int> v(10); // 크기 10의 벡터 생성
3) vector의 크기 지정하고 모두 같은 값으로 초기화
vector<int> v(10, 1); // 크기 10의 벡터에 전부 1로 초기화
4) vector의 원소를 지정하여 생성
vector<int> v = {1, 2, 3};
: Iterator를 활용해 vector의 원소에 접근 가능
v.begin()
: 벡터의 첫 번째 원소를 가리키는 iteratorv.end()
: 벡터의 마지막 원소 다음을 가리키는 iterator❗이터레이터
컨테이너에 저장되어 있는 원소들을 하나씩 접근할 수 있게 해줌.
모든 컨테이너들이 같은 방법으로 반복자 사용 가능.
각 타입에 ::iterator
또는 ::const_iterator
를 붙여 사용.
vector<int>::iterator itr;
vector<int>::const_iterator itr;
*itr = 3
과 같이 간접 참조로 반복자가 가리키는 원소 변경 불가능포인터와 비슷하게 사용
vector<int> v = {1, 2, 3}
; / vector<int>::iterator itr
이 존재itr = v.begin() + 1;
로 이터레이터 초기화 후 *itr
로 간접 참조시 2
가 반환됨vector에서 이터레이터 사용 예시
vector<int> v = {1, 2, 3, 4, 5};
for (auto itr = v.begin(); itr != v.end(); itr++) // auto가 vector<int>::iterator로 추론함.
cout << *itr << " ";
출력 결과 : 1 2 3 4 5
a. 초기화
v.assign(n)
: n개의 원소를 0으로 초기화v.assign(n, m)
: n개의 원소를 m으로 초기화b. 원소 접근
v.front()
: 첫 번째 원소 반환v.back()
: 마지막 원소 반환v.at(n) / v[n]
: n번째 원소 반환c. 원소 삽입 / 삭제
v.push_back(n)
: 벡터의 맨 뒤에 n 삽입v.pop_back(n)
: 맨 뒤 원소 삭제v.insert(iterator, n)
: iterator가 가리키는 위치에 n 삽입. 뒤에 있는 원소들은 한 자리씩 밀림.d. 벡터 크기 관련
v.size()
: 벡터의 원소 개수 반환
v.capacity()
: 벡터가 할당된 메모리 크기 반환
v.reserve(n)
: 벡터의 메모리 크기를 n으로 미리 할당.
vector<int> v = { 1, 2, 3 };
v.reserve(2); // 효과 없음. 오류는 발생하지 않음.
cout << "현재보다 작게 줄였을 때 size : " << v.size() << endl;
cout << "현재보다 작게 줄였을 때 capacity : " << v.capacity() << endl << endl;
v.reserve(4); // size는 그대로, capacity는 증가
cout << "현재보다 크게 늘렸을 때 size : " << v.size() << endl;
cout << "현재보다 크게 늘렸을 때 capacity : " << v.capacity() << endl;
v.resize(n)
: 벡터의 메모리 크기를 n으로 할당.
vector<int> v = { 1, 2, 3 };
v.resize(2); // size 감소, capacity는 그대로
cout << "현재보다 작게 줄였을 때 size : " << v.size() << endl;
cout << "현재보다 작게 줄였을 때 capacity : " << v.capacity() << endl << endl;
v.resize(4); // size 증가, capacity도 증가
cout << "현재보다 크게 늘렸을 때 size : " << v.size() << endl;
cout << "현재보다 크게 늘렸을 때 capacity : " << v.capacity() << endl;
e. 원소 삭제
v.clear()
: 전체 원소 삭제v.erase(iterator)
: iterator가 가리키는 원소 삭제. size만 변화, capacity는 그대로.: 동적 배열은 크기가 고정되지 않은 배열로서, 원소가 추가되거나 삭제될 때마다 메모리를 할당하거나 감소하는 작업이 일어난다. 하지만 이렇게 하나가 추가될 때마다 매번 작업을 수행하게 되면 비용이 많이 들기 때문에 미리 일정 배율로 공간을 할당해두게 된다.
벡터에서도 원소의 size와 capacity가 정비례로 증가하지 않고 일정 범위마다 일정 배율로 증가하는 것을 확인할 수 있다.
[예시 코드]
vector<int> v;
for (int i = 2; i < 50; i++)
{
cout << "size :" << v.size() << " / ";
cout << "capacity : " << v.capacity() << endl;
v.resize(i);
}