It won't hurt to try
[C++/윈도우프로그래밍응용]25. STL 컨테이너 본문
STL 컨테이너
01. 컨테이너
컨테이너(Container)
컨테이너란, 데이터를 저장하는 클래스
- 복잡한 데이터 구조를 쉽게 구현하는 데에 도움
- 템플릿을 사용하여 구현
- 서로 다른 자료형의 객체를 저장하는 데에 사용 가능
<일반적인 컨테이너의 목록>
컨테이너 | 설명 |
벡터(vector) | 동적 배열처럼 동작, 뒤에 자료 추가 |
큐(Queue) | 데이터가 입력된 순서대로 출력되는 자료 구조 |
스텍(Stack) | 먼저 입력된 데이터가 나중에 출력되는 자료 구조 |
우선순위 큐 | 큐의 일종, 큐의 요소들이 우선순위가 있어 우선순위가 높은 요소가 먼저 출력되는 자료 구조 |
리스트(List) | 벡터와 유사, 중간에 자료 추가 연산이 효율적 |
맵(Map) | 키-값(key-value) 형식으로 연관 탐색 가능 |
02. 컨테이너의 분류
컨테이너의 분류
순차 컨테이너
- 자료를 순차적으로 가지고 있음
- 자료의 추가나 삭제는 빠르지만, 탐색할 때 시간 소요 많음
연관 컨테이너
- 사전(dictionary)과 같은 구조로 자료를 저장
- 원소를 검색하기 위한 키(key)를 가지며, 자료는 정렬됨
- 자료의 추가/삭제에 시간이 걸리나, 자료의 탐색이 빠름
컨테이너 세부 분류
컨테이너 | 순차 시퀀스 | 벡터(vector) | 동적 배열 |
리스트(list) | 인덱스 순차적인 배열 | ||
덱(deque) | 인덱스 맨앞, 맨뒤에 데이터 입력 가능 | ||
연관 시퀀스 | 집합(set) | 집합 | |
맵(map) | dictionary형 |
03. 컨테이너의 공통 멤버 함수
컨테이너의 공통 멤버 함수
컨테이너의 공통 멤버 함수
함수 | 설명 |
Container() | 기본생성자 |
Container(size) | 크기가 size인 컨테이너 생성 |
Container(size, value) | 크기가 size이고 초기값이 value인 컨테이너 |
Container(iterator, iterator) | 다른 컨테이너로부터 초기값의 범위 받아 생성 |
begin() | 첫 번째 요소의 반복자 위치 |
clear() | 모든 요소 삭제 |
empty() | 비어있는 지 검사 |
end() | 반복자가 마지막 요소를 지난 위치 |
함수 | 설명 |
erase(iterator) | 컨테이너의 중간 요소 삭제 |
erase(iterator, iterator) | 컨테이너의 지정된 범위를 삭제 |
insert(iterator, value) | 컨테이너 중간에 value를 삽입 |
pop_back() | 컨테이너의 마지막 요소를 삭제 |
push_back(value) | 컨테이너의 끝에 데이터를 추가 |
rbegin() | 끝을 나타내는 역반복자 |
rend() | 역반복자가 처음을 지난 위치 |
size() | 컨테이너의 크기 |
operator=(Container) | 대입 연산자의 중복 정의 |
반복자
01. 반복자
반복자(iterator)
컨테이너의 요소를 가리키는 객체
- 기존의 포인터 개념과 비슷
- 일반화 된 포인터(generalized pointer)
- 컨테이너의 종류 상관없이 일관된 방법으로 요소 접근 가능
반복자를 사용하는 곳
- 컨테이너 요소에 접근하여 읽기/쓰기가 필요한 경우
시퀀스(sequence)
시퀀스 : 반복자의 핵심 개념
- 시퀀스에는 시작(begin)과 끝(end)이 있음
- 처음부터 끝까지 순회할 수 있으며, 중간 요소의 읽기/쓰기 또한 가능
반복자의 종류
전향 반복자(forward iterator)
- 전방향으로만 진행, ++ 연산자만 사용 가능
양방향 반복자(bidirectional iterator)
- 전후 방향 진행 가능, ++, -- 연산자 모두 사용 가능
무작위 접근 반복자(random access iterator)
- ++ 연산자와 --연산자, [] 연산자 사용 가능
반복자에서 사용할 수 있는 연산자
연산자 | 설명 |
++ | 컨테이너에서 다음 요소를 가리킴 |
-- | 컨테이너에서 이전 요소를 가리킴 |
==, != | 두 반복자가 같은 요소를 기리키는지 비교 |
* | 반복자가 가리키는 요소의 값을 추출하는 역참조 연산자 |
반복자의 예시
vector에서 반복자를 사용하는 경우
vector<int> scores;
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); ++it)
cout << *it << endl;
- it의 초기값은 v.begin()을 통해 얻음
- it의 현재 위치가 마지막 위치인지 비교하기 위해 != 연산자 사용가능
- ++연산자를 이용해서 반복자 전방향 이동
vector에서 반복자를 사용하는 경우(auto 사용)
vector<int> scores;
for (auto it = v.begin(); it != v.end(); ++it)
cout << *it << endl;
- C++14 이후부터는 auto 키워드를 이용하여 반복자의 자료형을 복잡하게 선언하지 않고도 구현 가능
vector에서 auto + 범위기반루프를 사용하는 경우
vector<int> scores;
for (auto & n : v)
cout << n << endl;
- C++14 이후부터는 범위 기반 루프를 사용하여 반복자를 사용하지 않고 값을 읽어들일 수 있음
- 그러나 컨테이너 중간에 데이터를 삽입하거나 데이터를 삭제하는 등의 작업을 위해서는 반복자 필요
300x250
300x250
Comments