Container 란?

STL 에서 Container 는 무엇이고, 어떤 특징을 가지고 있는지 알아보자.


Container

컨테이너는 STL 의 핵심이라고 할 수 있다. 컨테이너는 객체를 저장하고 구조화하게 해주는 기능을 한다. 물론, 컨테이너를 사용하기 위해서 데이터에 접근해야 하므로 반복자도 사용해야 한다.

STL 에서 제공하는 컨테이너는 3가지로 구분할 수 있다.

  • 순차 컨테이너 – 객체들을 선형(linear) 로 저장한다. 선형이라는 것은 반드시 연속된 메모리로 저장될 필요가 없다는 뜻을 의미한다. 멤버 함수, 반복자 또는 상황에 따라서 첨자 연산자와 인덱스를 사용하여 컨테이너에 저장된 객체에 접근할 수 있다. (array, vector, deque, list, forward_list 가 대표적이다.)
  • 연과 컨테이너 – 객체들을 연관된 키와 함께 저장한다. 키를 이용해서 연관 컨테이너에서 객체를 가져올 수도 있고, 반복자를 사용해서도 연관 컨테이너에서 객체들을 가져 올 수 있다. (map, multimap, unordered_map, unordered_multimap 이 대표적이다.)
  • 컨테이너 어댑터 – 순차 컨테이너나 연관 컨테이너에 저장된 데이터에 접근하는 다른 방법을 제공한다. 컨테이너의 기존 인터페이스를 확장하기 때문에 이런 클래스 템플릿을 어댑터 클래스라고 부른다. (stack, queue, priority_queue 가 대표적이다.)


특징

컨테이너는 이동 시맨틱(이동 생성자와 이동 할당 연산자)이 없는 경우라면 ,모든 STL 컨테이너는 객체를 컨테이너에 저장할 때 복사를 한다. 따라서, 원본을 수정한다고 해서 컨테이너에 있는 값이 변하는 것이 아니다. 하지만, 컨테이너에서 객체에 대한 참조를 겨자와서 수정하면 컨테이너의 데이터가 변경된다. 따라서, 컨테이너에 원본 객체에 대한 포인터를 저장하거나 원본 타입에 대한 이동 시맨틱이 구현되어 있다면 더 효율적으로 원본을 컨테이너로 저장 및 이동시킬 수 있다.

컨테이너는 객체들을 힙에 저장하고, 객체가 차지하는 공간도 관리한다. 만약 T 객체를 컨테이너에 저장한다면 타입 T 가 따라야 할 조건들이 있다. 원소들을 복제하고, 이동하거나 교환해야 하기 때문이다. 따라서, T 객체가 사용자 정의 클래스라면 컴파일러가 기본으로 구현해주는 것 이외에 해당 조건들을 충족할 수 있도록 직접 정의해 주어야 한다.




Reply