[C++] STL 컨테이너 - 벡터(vector)
C++는 표준 템플릿 라이브러리(STL)를 제공한다.
STL에 구현된 제네릭 클래스나 함수를 잘 활용하면, 더 쉽게 C++ 프로그램을 작성할 수 있다.
그 중 벡터(vector)는 스스로 크기를 조절하는 배열을 구현한 제네릭 컨테이너(container) 클래스이다.
우리는 멤버함수를 통해서 배열에 원소를 저장, 삭제, 검색할 수 있다.
vector를 사용하려면 우선 <vector> 헤더파일을 include 해야 한다.
#include <vector>
그리고 vector 객체를 생성해야한다. <> 안에 타입을 지정한다.
vector<int> my_vector;
vector<string> name; // <string> 헤더 파일 include
vector는 배열과 마찬가지로 [ ]로 원소에 접근할 수 있다.
my_vector[3] = 7;
vector에 원소를 삽입하려면 push_back 함수를 사용하면 되고, 원소를 삭제하려면 pop_back 함수를 사용하면 된다.
my_vector.push_back(2);
my_vector.push_back(5);
my_vector.push_back(7);
my_vector.pop_back(); // 가장 마지막에 push_back한 7이 삭제됨
vector의 원소의 개수는 size() 함수를 통해서 알 수 있고,
vector에 할당된 메모리의 용량은 capacity() 함수를 통해서 알 수 있다.
이 둘의 차이점은 https://boycoding.tistory.com/236 를 참고하면 좋을 것 같다.
for(int i = 0; i < my_vector.size(); i++) // 벡터의 모든 원소 출력
cout << my_vector[i] << endl;
front()와 back()은 각각 벡터의 첫번째 원소, 마지막 원소를 리턴하고,
begin()과 end()는 각각 벡터의 첫 번째 원소, 벡터의 끝에 대한 참조를 리턴한다.
주의해야 할 점은 end()는 벡터의 마지막 원소가 아니라 마지막 원소 다음을 가리킨다는 점이다.
vector<int>의 원소를 가리키는 포인터 변수(iterator)를 생성하면 vector를 더 잘 활용할 수 있다.
참고로 iterator는 컨테이너(queue, stack, map, list 등)의 원소들을 하나씩 접근하는 데에 쓰이는 포인터 변수이다.
iterator를 사용하려면 <>안에 가리킬 컨테이너 원소의 type을 지정해서 변수를 생성해야 한다.
vector<int>::iterator it;
/* 벡터의 모든 원소 출력 */
for(it = my_vector.begin(); it != my_vector.end(); it++) {
cout << *it << endl;
}
insert(iterator it, element)와 erase(iterator it) 함수로 vector의 원하는 위치에 삽입과 삭제가 가능하다.
이때 insert 함수는 새롭게 추가된 원소를 가리키는 포인터를 리턴하고, erase 함수는 삭제한 원소의 다음 원소에 대한 포인터를 리턴한다. (이때 삭제한 원소의 다음 원소들은 자동으로 앞으로 이동된 상태이다.)
insert 함수의 인자가 3개이면, 예를 들어 insert(it, 3, 500)을 하면, it의 위치에 500이 3개 삽입된다는 뜻이다.
my_vector.erase(it+3);
it = my_vector.erase(it); // it가 가리키는 원소 삭제 후 it 재설정 필요
참고한 자료:
명품 C++ 프로그래밍 (황기태 지음)