STL 컨테이너

STL은 Standard Template Library의 약자로 C++ 에서 자료구조와 알고리즘의 Generic Programming (일반화 프로그래밍) 개념을 구현하기 위해 개발 된 C++ 라이브러리입니다. 이러한 STL 라이브러리의 종류와 컨데이너의 특성 및 사용법등을 정리해두려 합니다.

​

구성요소

  • 반복자 : STL 컨테이너의 원소들을 가리키는 포인터
  • 컨테이너: 데이터를 저장 및 관리를하는 클래스
  • 알고리즘 : STL에서 제공하는 함수

​

STL 컨테이너 종류

  1. 시퀀스 컨테이너
    1. 데이터를 선형적으로 저장합니다.
    2. vector, list, dequeue …
  2. 연관 컨테이너
    1. 일정 규칙에 따라 조직화된 컨테이너입니다.
    2. set, multiset, map …
  3. 어뎁터 컨테이너
    1. 시퀀스나 연관 컨테이너를 변형하여 정해진 방식으로 관리합니다.
    2. stack, queue …

​

시퀀스 컨테이너

시퀀스 컨테이너는 데이터를 선형적으로 저장하고 삽입된 요소의 순서가 그대로 유지됩니다.

​

벡터 (vector)

일반적인 배열은 배열의 길이가 정적인 특징의 단점을 극복하기 위한 컨테이너로 요소가 추가되거나 삭제될때 자동으로 메모리를 재할당 하고 크기를 동적으로 바꿉니다.

문법
1
2
#include <vector>
vector<Type> name(초기크기);

vector의 초기 크기를 지정하지 않으면 빈 백터를 생성합니다.

함수
  1. size() : 컨테이너에 저장된 요소의 개수를 반환
  2. push_front() : 맨 처음에 원소를 추가
  3. push_back() : 맨 끝에 원소를 추가
  4. pop_front() : 첫번째 원소를 제거
  5. pop_back() : 마지막 원소를 제거
  6. begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환
  7. end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환
  8. empty() : 컨테이너가 비었는지 확인

​

데크(deque)

dequeue는 양방향 큐를 의미하며, 양쪽에 끝이 있는 큐입니다. 이 컨테이너를 이용하면 양끝에서 삽입과 삭제를 빠르게 할 수 있습니다. vector와 마찬가지로 동적길이를 갖습니다.

문법
1
2
#include <deque>
deque<Type> name(초기크기);
함수
  1. size() : 컨테이너에 저장된 요소의 개수를 반환
  2. front() : 첫번째 원소에 접근
  3. back() : 마지막 원소에 접근
  4. push_front() : 맨 처음에 원소를 추가
  5. push_back() : 맨 끝에 원소를 추가
  6. pop_front() : 첫번째 원소를 제거
  7. pop_back() : 마지막 원소를 제거
  8. begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환
  9. end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환
  10. empty() : 컨테이너가 비었는지 확인

​

리스트(list)

리스트 컨테이너는 이중연결 리스트를 구현한 클래스 입니다.

문법
1
2
#include<list>
list<Type> name;
함수
  1. size() : 컨테이너에 저장된 요소의 개수를 반환
  2. front() : 첫번째 원소에 접근
  3. back() : 마지막 원소에 접근
  4. push_front() : 맨 처음에 원소를 추가
  5. push_back() : 맨 끝에 원소를 추가
  6. pop_front() : 첫번째 원소를 제거
  7. pop_back() : 마지막 원소를 제거
  8. begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환
  9. end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환
  10. empty() : 컨테이너가 비었는지 확인

​

연관 컨테이너

연관 컨테이너는 Key, Value 와 같이 관련있는 데이터를 하나의 쌍으로 저장하는 컨테이너 입니다. 연관 컨테이너는 보통 균형 이진 트리나 해시 테이블을 사용하여 구현됩니다. 아래의 컨테이너들은 균형 이진 트리중 하나인 레드블랙 트리를 이용합니다.

​

집합(set) / 멀티 집합(multiset)

집합 컨테이너는 저장하는 데이터 그 자체를 키로 사용하는 연관 컨테이너 입니다. 내부적으로 정렬되어 있어 빠른 검색속도를 가집니다.

set은 중복을 허용하지 않지만, multiset은 중복을 허용합니다.

문법
1
2
#include<set>
set<Type> name;
함수
  1. find() : 해당 요소를 가리키는 반복자를 반환
  2. size() : 컨테이너에 저장된 요소의 개수를 반환
  3. insert() : 요소를 컨테이너에 추가
  4. erase() : 요소를 컨테이너에서 제거
  5. begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환
  6. end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환
  7. empty() : 컨테이너가 비었는지 확인

​

맵(map) / 멀티맵(multimap)

맵 컨테이너는 Key와 Value의 쌍으로 데이터를 관리하는 연관 컨테이너 입니다. 맵 컨테이너도 빠른 검색 속도를 가집니다. map은 중복을 허용하지 않지만, multimap은 중복을 허용합니다.

문법
1
2
#include<map>
map<KType, VType> name;
함수
  1. find() : 해당 요소를 가리키는 반복자를 반환
  2. size() : 컨테이너에 저장된 요소의 개수를 반환
  3. insert() : 요소를 컨테이너에 추가
  4. erase() : 요소를 컨테이너에서 제거
  5. begin() : 컨테이너의 첫 요소를 가리키는 반복자를 반환
  6. end() : 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환
  7. empty() : 컨테이너가 비었는지 확인

​

어댑터 컨테이너

어댑터 컨테이너는 기존 컨테이너의 인터페이스를 제한하거나 변형하여 만든 컨테이너 입니다. 하지만 반복자를 지원하지 않아 STL 알고리즘을 이용할 수 없습니다.

​

스택(stack)

vector클래스의 인터페이스를 제한해 구현한 스택 구조를 가지는 클래스 입니다.

문법
1
2
#include <stack>
stack<Type> name;
함수
  1. size() : 컨테이너에 저장된 요소의 개수를 반환
  2. top() : 스택의 최 상단의 요소의 참조를 반환
  3. push() : 스택 최상단에 요소 추가
  4. pop() : 스택 최상단에서 요소를 제거
  5. empty() : 컨테이너가 비었는지 확인

​

큐(queue)

큐는 deque클래스를 이용하여 큐를 구현한 클래스 입니다.

문법
1
2
#include <queue>
queue<Type> name;
함수
  1. size() : 컨테이너에 저장된 요소의 개수를 반환
  2. front() : 첫번째 원소에 접근
  3. back() : 마지막 원소에 접근
  4. push() : 큐에 맨 마지막에 요소를 추가
  5. pop() : 큐의 맨 앞의 요소를 제거
  6. empty() : 컨테이너가 비었는지 확인

​

우선순위 큐(priority_queue)

우선순위 큐는 vector클래스를 이용하여 힙을 구현해 우선순위큐를 구현한 클래스 입니다.

문법
1
2
#include <queue>
priority_queue<Type> name;
함수
  1. size() : 컨테이너에 저장된 요소의 개수를 반환
  2. push() : 우선순위 큐에 요소를 추가
  3. top() : 우선순위 큐에서 맨위의 요소에 접근
  4. pop() : 우선순위 큐에서 맨위의 요소 제거
  5. empty() : 컨테이너가 비었는지 확인