이번 포스팅에서는 STL의 벡터(Vector)에 대해서 정리해 보려고 한다.
C++의 표준 템플릿 라이브러리(STL)는 C++ 프로그래밍에서 필요한 자료구조와 알고리즘을 템플릿으로 제공하는 라이브러리이다. STL은 일반적으로 다음 세 가지 라이브러리를 의미한다.
- 컨테이너(Container) : 임의 타입의 객체를 보관. 객체를 저장하는 자료구조
- 시퀀스 컨테이너(Sequence Container) : Array, Vector, List, Deque
- 협력 컨테이너(Associative Container) : Set, Multiset, Map, Multimap
- 반복자(Iterator) : 포인터와 유사한 개념. 컨테이너에 보관된 원소에 접근하여 다음 원소를 가리킴. 순회
- 알고리즘(Algorithm) : 반복자들을 가지고 일련의 작업(정렬, 삭제, 검색, 연산 등)을 수행
이번 포스팅에서 다뤄 볼 주제는 벡터(Vector) 컨테이너이다. 벡터 컨테이너는 쉽게 한 마디로 표현하면 자동으로 메모리가 할당되는 배열 이라고 말할 수 있을 것이다. 벡터가 가진 주요 특징은 다음과 같다.
- 어떠한 자료형도 넣을 수가 있다. 기본(primitive) 데이터, 클래스, 포인터 등등
- 그 안에 저장된 모든 요소들이 연속된 메모리 공간에 위치한다.
- 요소 수가 증가함에 따라 자동으로 메모리가 관리된다.
- 어떤 요소에도 임의로 접근(random access)이 가능하다.
벡터 선언은 다음과 같이 할 수 있다.
std::vector<<type>><name>(const vector& x);
아래 예제는 scores 벡터와 같은 크기 및 데이터를 가지는 scores1 벡터를 복사해서 만드는 코드이다.
아래의 예제는 int 형 벡터를 만들어서 기본적인 연산을 해 주었다. push_back()을 통해 가장 마지막에 요소를 추가할 수도 있고, pop_back()을 통해 가장 마지막에 있는 요소를 뺄 수도 있다.
여기에서 용량(Capacity)과 크기(Size)의 개념이 등장한다.
- 용량(Capacity) : Vector에 할당된 요소 공간 수. 위의 예제의 경우 2
- 크기(Size) : Vector에 실제로 들어 있는 요소 수. 위의 예제의 경우 1
벡터의 용량을 늘리고 싶다면 reserve(<size>) 메서드를 사용하면 된다. 용량이 증가해야 하면 새로운 저장 공간을 재 할당 하고 기존 요소들을 모두 새 공간으로 복사한다. 불필요한 재 할당을 막기 위하여 vector를 생성한 직후에 이 함수를 호출한다.
벡터 요소 하나의 접근하기 위한 코드는 아래와 같다.
operator[](size_t n);
이는 지정된 위치(n)의 요소를 참조로 반환한다.
또한 for문의 경우는 벡터에서만 쓸 수 있다. map에서는 index로 operator[]를 쓸 수 없다. 그래서 STL 컨테이너를 순회할 때는 반복자(iterator)를 쓰는 것이 표준 방식이다.
반복자에는 begin과 end가 있는데 다음과 같이 사용이 된다.
만약 뒤에서부터 앞으로 역순으로 접근을 하고 싶다면, 역방향 반복자(reverse iterator)를 사용하면 된다.
역방향 반복자는 reverse_iterator 라는 오브젝트가 따로 존재한다.
std::vector<int>::reverse_iterator reversedBeginIt = scores.rbegin();
std::vector<int>::reverse_iterator reversedEndIt = scores.rend();
이 이외에 벡터에 요소를 대입하거나 두 벡터를 교환하는 경우에는 assign(), swap() 메서드를 사용할 수 있다.
참고로 두 벡터를 교환하는 시간은 매우 빠르다. 주소값(포인터)만 서로 교차해 주면 되기 때문이다. 메모리 자체를 카피하지는 않는다.
벡터의 크기를 바꿀 때 resize() 메서드를 사용한다. 용량이 아니라 크기를 바꾸는 점에 유의하자.
마지막으로 벡터가 가진 장단점에 대해서 요약해 보고 마무리를 하려고 한다.
벡터의 장점
- 순서에 상관없이 요소에 임의적으로 접근 가능
- 제일 마지막 위치에 요소를 빠르게 삽입 및 삭제
벡터의 단점
- 중간에 요소 삽입 및 삭제는 느림
- 재할당 및 요소 복사에 드는 비용
참고자료
- <C++ 언매니지드 프로그래밍> 포큐 아카데미
'Prog. Langs & Tools > C++' 카테고리의 다른 글
[C++] Ch12. 템플릿(Template) 프로그래밍 (0) | 2021.05.03 |
---|---|
[C++] Ch11. STL - 맵(Map) (0) | 2021.04.14 |
[C++] Ch09. 예외(Exception) (0) | 2021.01.11 |
[C++] Ch08. 인라인 함수, static 키워드 (0) | 2020.11.30 |
[C++] Ch07. 캐스팅(Casting) (0) | 2020.11.16 |