[STL/C++] 시퀀스 컨테이너

6 분 소요

내가 보려고 만든 C++ STL 정리 - Sequence Container

STL 컨테이너는 시퀀스 컨테이너와 연관 컨테이너로 나눌 수 있다. 표준 시퀀스 컨테이너는 vector, list, deque이다.

vector

vector의 주요 인터페이스

템플릿 형식
template<typename T, typename Allocator = allocator<T>> class vector

T는 vector 컨테이너 원소의 형식이고, 할당자는 디폴트가 allocator<T>이다. 디폴트 외의 할당자를 쓰는 법은 나도 모른다.

생성자  
vector v v는 빈 컨테이너
vector v(n) v는 기본 값으로 초기화된 n개의 원소를 갖는다
vector v(n, x) v는 x값으로 초기화된 n개의 원소를 갖는다
vector v(v2) 복사 생성자
vector v(b, e) v는 반복자 구간 [b, e)로 초기화된 원소를 갖는다
멤버 함수  
v.assign(n, x) v에 x값으로 n개의 원소를 할당
v.assign(b, e) v를 반복자 구간 [b, e)로 할당
v.at(i) v의 i번째 원소를 참조한다(const, non const version exist & include range check)
v.back() v의 마지막 원소 참조(const, non const version exist)
p = v.begin() p는 v의 첫 원소를 가리키는 반복자(const, non const version exist)
x = v.capacity() x는 v에 할당된 공간의 크기
v.clear() v의 모든 원소를 제거한다
v.empty() v가 비었는지 조사
p = v.end() p는 v의 끝을 가리키는 반복자(const, non const version exist)
q = v.erase(p) p가 가리키는 원소를 제거한다. q는 다음 원소를 가리킨다
q = v.erase(b,e) 반복자 구간 [b, e)의 모든 원소를 제거한다. q는 다음 원소를 가리킨다
v.front() v의 첫 번째 원소를 참조한다(const, non const version exist)
q = v.insert(p, x) p가 가리키는 위치에 x를 삽입, q는 삽입한 원소를 가리키는 반복자
v.insert(p, n, x) p가 가리키는 위치에 n개의 x값을 삽입
v.insert(p, b, e) p가 가리키는 위치에 반복자 구간 [b, e)의 원소를 삽입한다.
x = v.max_size() x는 v가 담을 수 있는 최대 원소의 개수(메모리 크기)
v.pop_back() v의 마지막 원소 제거
v.push_back(x) v의 끝에 x를 추가
p = v.rbegin() p는 v의 역 순차열의 첫 원소를 가리키는 반복자(const, non const version exist)
p = v.rend() p는 v의 역 순차열의 끝을 표식하는 반복자(const, non const version exist)
v.reserve(n) n개의 원소를 저장할 공간을 예약한다
v.resize(n) v의 크기를 n으로 변경하고 확장되는 공간의 값을 기본값으로 초기화
v.resize(n, x) v의 크기를 n으로 변경하고 확장되는 공간의 값을 x값으로 초기화
v.size() v 원소의 개수
v.swap(v2) v와 v2를 swap한다
연산자  
v1 == v2 v1과 v2의 모든 원소가 같은가(bool)
v1 != v2 v1과 v2의 모든 원소 중 하나라도 다른 원소가 있는가(bool)
v1 < v2 문자열 비교처럼 v2가 v1보다 큰가(bool)
v1 <= v2 생략
v1 > v2 생략
v1 >= v2 생략
v[i] v의 i번째 원소를 참조(const, 비 const 버전이 있고 범위점검이 없음

멤버 형식의 종류

  • alloator_type
  • const_iterator
  • const_pointer
  • const_reference
  • const_reverse_iterator
  • difference_type
  • iterator
  • pointer
  • reference
  • reverse_iterator
  • size_type
  • value_type

메모리 확장 정책

vector는 원소가 하나의 메모리 블록에 연속적으로 저장된다. 컴파일러마다 조금씩 다르지만 대부분 (이전 capacity) + (이전 capacity / 2)를 만족한다. 가령, 원소가 6개 들어있는 vector 컨테이너에 push_back(n)을 하면 capacity를 9로 재할당하여 원소들을 복사한다. 참고로 capacity()는 vector 컨테이너만 제공한다.

deque

deque 컨테이너의 주요 인터페이스

템플릿 형식
template<typename T, typename Allocator = allocator<T>> class deque
생성자  
deque dq dq는 빈 컨테이너
deque dq(n) dq는 기본 값으로 초기화된 n개의 원소를 갖는다
deque dq(n, x) dq는 x값으로 초기화된 n개의 원소를 갖는다
deque dq(dq2) 복사 생성자
deque dq(b, e) dq는 반복자 구간 [b, e)로 초기화된 원소를 갖는다
멤버 함수  
dq.assign(n, x) dq에 x값으로 n개의 원소를 할당
dq.assign(b, e) dq를 반복자 구간 [b, e)로 할당
dq.at(i) dq의 i번째 원소를 참조한다(const, non const version exist & include range check)
dq.back() dq의 마지막 원소 참조(const, non const version exist)
p = dq.begin() p는 dq의 첫 원소를 가리키는 반복자(const, non const version exist)
dq.clear() dq의 모든 원소를 제거한다
dq.empty() dq가 비었는지 조사
p = dq.end() p는 dq의 끝을 가리키는 반복자(const, non const version exist)
q = dq.erase(p) p가 가리키는 원소를 제거한다. q는 다음 원소를 가리킨다
q = dq.erase(b,e) 반복자 구간 [b, e)의 모든 원소를 제거한다. q는 다음 원소를 가리킨다
dq.front() v의 첫 번째 원소를 참조한다(const, non const version exist)
q = dq.insert(p, x) p가 가리키는 위치에 x를 삽입, q는 삽입한 원소를 가리키는 반복자
dq.insert(p, n, x) p가 가리키는 위치에 n개의 x값을 삽입
dq.insert(p, b, e) p가 가리키는 위치에 반복자 구간 [b, e)의 원소를 삽입한다.
x = dq.max_size() x는 dq가 담을 수 있는 최대 원소의 개수(메모리 크기)
dq.pop_back() dq의 마지막 원소 제거
dq.pop_front() dq의 첫 원소 제거
dq.push_back(x) dq의 끝에 x를 추가
dq.push_front(x) dq의 앞쪽에 x를 가가
p = dq.rbegin() p는 dq의 역 순차열의 첫 원소를 가리키는 반복자(const, non const version exist)
p = dq.rend() p는 dq의 역 순차열의 끝을 표식하는 반복자(const, non const version exist)
dq.resize(n) dq의 크기를 n으로 변경하고 확장되는 공간의 값을 기본값으로 초기화
dq.resize(n, x) dq의 크기를 n으로 변경하고 확장되는 공간의 값을 x값으로 초기화
dq.size() dq 원소의 개수
dq.swap(dq2) dq와 dq2를 swap한다
연산자  
dq1 == dq2 dq1과 dq2의 모든 원소가 같은가(bool)
dq1 != dq2 dq1과 dq2의 모든 원소 중 하나라도 다른 원소가 있는가(bool)
dq1 < dq2 문자열 비교처럼 dq2가 dq1보다 큰가(bool)
dq1 <= dq2 생략
dq1 > dq2 생략
dq1 >= dq2 생략
dq[i] dq의 i번째 원소를 참조(const, 비 const 버전이 있고 범위점검이 없음

멤버 형식의 종류

  • alloator_type
  • const_iterator
  • const_pointer
  • const_reference
  • const_reverse_iterator
  • difference_type
  • iterator
  • pointer
  • reference
  • reverse_iterator
  • size_type
  • value_type

메모리 확장 정책

vector는 앞이 막힌구조인 반면, deque은 양 쪽 다 뚫려있다. vector는 capacity보다 더 크게 들어올 경우 메모리를 재할당하고 원소를 전부 옮기는 반면, deque은 메모리 블록을 하나 할당해서 최종적으로 데이터를 여러 메모리 블록에 나뉘어서 저장한다. 굳이 원래 원소들을 전부 삭제할 필요가 없다. 둘 다, insert나 erease시에 그 위치에서부터의 모든 원소들을 밀어내야 한다는 비효율적인 면이 있으나 deque은 앞으로도 밀어낼 수 있기 때문에 vector보다는 덜 비효율적이라고 할 수 있다.

list 컨테이너

list 컨테이너 주요 인터페이스

템플릿 형식
template<typename T, typename Allocator = allocator<T>> class list
생성자  
list lt lt는 빈 컨테이너
list lt(n) lt는 기본 값으로 초기화된 n개의 원소를 갖는다
list lt(n, x) lt는 x값으로 초기화된 n개의 원소를 갖는다
list lt(lt2) 복사 생성자
list lt(b, e) lt는 반복자 구간 [b, e)로 초기화된 원소를 갖는다
멤버 함수  
lt.assign(n, x) lt에 x값으로 n개의 원소를 할당
lt.assign(b, e) lt를 반복자 구간 [b, e)로 할당
lt.back() lt의 마지막 원소 참조(const, non const version exist)
p = lt.begin() p는 lt의 첫 원소를 가리키는 반복자(const, non const version exist)
lt.clear() lt의 모든 원소를 제거한다
lt.empty() lt가 비었는지 조사
p = lt.end() p는 lt의 끝을 가리키는 반복자(const, non const version exist)
q = lt.erase(p) p가 가리키는 원소를 제거한다. q는 다음 원소를 가리킨다
q = lt.erase(b,e) 반복자 구간 [b, e)의 모든 원소를 제거한다. q는 다음 원소를 가리킨다
lt.front() lt의 첫 번째 원소를 참조한다(const, non const version exist)
q = lt.insert(p, x) p가 가리키는 위치에 x를 삽입, q는 삽입한 원소를 가리키는 반복자
lt.insert(p, n, x) p가 가리키는 위치에 n개의 x값을 삽입
lt.insert(p, b, e) p가 가리키는 위치에 반복자 구간 [b, e)의 원소를 삽입한다.
x = lt.max_size() x는 lt가 담을 수 있는 최대 원소의 개수(메모리 크기)
lt.pop_back() lt의 마지막 원소 제거
lt.pop_front() lt의 첫 원소 제거
lt.push_back(x) lt의 끝에 x를 추가
lt.push_front(x) lt의 앞쪽에 x를 추가
p = lt.rbegin() p는 lt의 역 순차열의 첫 원소를 가리키는 반복자(const, non const version exist)
p = lt.rend() p는 lt의 역 순차열의 끝을 표식하는 반복자(const, non const version exist)
lt.resize(n) lt의 크기를 n으로 변경하고 확장되는 공간의 값을 기본값으로 초기화
lt.resize(n, x) lt의 크기를 n으로 변경하고 확장되는 공간의 값을 x값으로 초기화
lt.size() lt 원소의 개수
lt.sort() lt의 모든 원소를 오름차 순으로 정렬
lt.sort(pred) lt의 모든 원소를 pred(조건자)를 기준으로 정렬, pred(조건자)는 이항 조건자
lt.splice(p, lt2) p가 가리키는 위치에 lt2의 모든 원소를 잘라 붙인다.
lt.splice(p, lt2, q p가 가리키는 위치에 lt2의 q가 가리키는 원소를 잘라 붙인다.
lt.splice(p, lt2, b, e) p가 가리키는 위치에 lt2의 순차열 [b, e)을 잘라 붙인다.
lt.swap(lt2) lt와 lt2를 swap한다
lt.unique() 인접한 원소의 값이 같다면 유일한 원소의 순차열로 만든다.
lt.unique(pred) 인접한 원소가 pred(이항 조건자)의 기준에 맞다면 유일한 원소의 순차열로 만든다.
연산자  
lt1 == lt2 lt1과 lt2의 모든 원소가 같은가(bool)
lt1 != lt2 dq1과 lt2의 모든 원소 중 하나라도 다른 원소가 있는가(bool)
lt1 < lt2 문자열 비교처럼 lt2가 lt1보다 큰가(bool)
lt1 <= lt2 생략
lt1 > lt2 생략
lt1 >= lt2 생략

멤버 형식의 종류

  • alloator_type
  • const_iterator
  • const_pointer
  • const_reference
  • const_reverse_iterator
  • difference_type
  • iterator
  • pointer
  • reference
  • reverse_iterator
  • size_type
  • value_type

카테고리:

업데이트:

댓글남기기