본문 바로가기

Prog. Langs & Tools/C++

[C++] Ch10. STL - 벡터(Vector)

 

이번 포스팅에서는 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() 메서드를 사용한다. 용량이 아니라 크기를 바꾸는 점에 유의하자.

마지막으로 벡터가 가진 장단점에 대해서 요약해 보고 마무리를 하려고 한다.

 

벡터의 장점

  • 순서에 상관없이 요소에 임의적으로 접근 가능
  • 제일 마지막 위치에 요소를 빠르게 삽입 및 삭제

벡터의 단점

  • 중간에 요소 삽입 및 삭제는 느림
  • 재할당 및 요소 복사에 드는 비용

 

참고자료

  1. <C++ 언매니지드 프로그래밍> 포큐 아카데미