본문 바로가기

카테고리 없음

Standard Template Library (STL)

표준 템플릿 라이브러리는 C++의 템플릿과 연산자 오버로딩을 광범위하게 사용하고 있음

C++ 표준 라이브러리 개괄

1. 문자열
: <string>에 정의된 자체적인 string 클래스를 지원한다. 메모리 보호를 위한 인덱스 경계 검사, 대입, 비교, 문자열 연결, 문자열 추출, 문자 또는 문자열 치환 같은 여러 기능을 제공

2. 정규 표현식
: <regex> 헤더 파일을 통해 지원한다. 문자열 처리에 이용되는 패턴 매칭을 쉽게 할 수 있게 해준다.

3. I/O 스트림
: 파일, 콘솔/키보드, 문자열을 읽고 쓰는 함수들을 제공

4. 스마트 포인터
: 좀 더 안정적인 프로그램을 만드는데 장애 요소 중 하나인 객체의 삭제를 자동으로 해준다.
메모리 릭 - 객체를 아예 삭제하지 않아 메모리를 낭비하는 것
댕글링 포인터 - 메모리 공간을 이미 반환해버려서 다른 용도로 사용되 고 있을 수 있는데 해당 메모리를 다른 코드에서 계속 참조하는 경우
더블 프리 문제 - 어떤 코드에서 메모리를 해제했는데, 다른 코드에서  그 메모리를 중복해서 해제하려는 경우

5. 익셉션
: 함수나 메서드에서 호출 깊이와 관계없이 여러 타입의 에러 정보를  전달할 수 있게 하는 메커니즘

6. 함수 객체
: 함수 호출 연산자를 오버로딩하고 있는 클래스. <functional> 헤더파 일은 몇가지 함수 객체를 정의하고 있고, 이미 존재하는 함수 객체를  기반으로 새로운 함수 객체를 만드는 기능을 제공한다.

7. 멀티스레딩
: 복수의 코어를 활용하게 하고 싶을 때 사용한다.

8. 표준 템플릿 라이브러리
STL 컨테이너
: 항목에 대한 정보를 저장한다. 연결 리스트나 큐 등 목적에 따라 적   합한 데이터 구조를 구현하여 저장한다. 템플릿으로 구현되어 있기 때 문에 저장하는 데이터 타입과 관계없이 사용할 수 있다. 하나의 컨테이 너에는 한 가지 타입의 항목만 저장할 수 있다.

1) vector
  : 항목의 나열을 저장하고 항목별로 랜덤 액세스를 할 수 있게 한다.   항목이 추가, 삭제될 때마다 자동으로 크기가 늘어나고 줄어든다. 배  열과 달리 인덱스 경계 검사도 자동으로 수행한다. 마지막 인덱스에   항목을 삽입 또는 삭제할 때 O(1)로 빠른 성능을 가진다. 항목에 빨리   접근해야 한다면 vector를 이용하는 것이 좋다.
  2) list
  : 이중 연결 리스트 데이터 구조이다. vector나 배열과 달리 list에   저장된 항목이 메모리에 연속적으로 위치하지 않을 수도 있다. 대신   앞에 있는 항목과 뒤에 있는 항목이 저장된 위치만 관리한다.
  list는 배열과 정반대의 성능 특성을 보인다. 항목을 찾거나 접근하는   시간은 느리지만 특정 위치에 항목을 삽입하거나 삭제하는 시간은 빠  르다. 항목 삽입과 삭제 성능이 더 중요하다면 vector대신 list를 이  용하는 것이 좋다.

  3) forward_list
  : 단방향 연결 리스트, 순방향 순회만 지원하며 list보다 메모리를 적  게 사용한다. 항목에 대한 임의 접근은 빠르게 할 수 없다.

  4) deque
  : vector와 비슷하게 동작하는 데이터구조로 양방향 큐의 약자다. 항목 탐색, 색인에 O(1)에 빠른 성능을 제공한다. 항목 삽입과 삭제를 항목열 중간에 하면 느린 선형 시간 성능을 가진다.

  5) array
  : 아무런 오버헤드 없이 고정된 개수의 항목을 담을 수 있다. 스스로  의 크기 정보를 가지며, 특정 상황에서의 오류를 피하기위해 자동으로   포인터로 반환되지 않는다. 삽입과 삭제를 지원하지 않는다. 크기가   고정되어 있기 때문에 스택 메모리에도 저장될 수 있다.

  6) queue
  : FIFO로 동작한다. 한쪽 끝에서 새로운 항목을 삽입하고 반대쪽 끝에  서 항목을 꺼낸다. 선착순 개념을 구현해야할 때 queue구조를 이용한  다.

  7) priority_queue (우선순위 큐)
  : 각 항목이 우선순위를 가진다. 삽입과 삭제가 일어날 때마다 우선순  위에 맞추어 재정렬하므로 일반 queue보다 삽입과 삭제 속도가 느리다  .

  8) stack
  : 선입후출(FILO) 또는 후입선출(LIFO) 컨테이너 데이터 구조를 제공  한다. 항목을 삽입하고 삭제할 수 있지만, 가장 최근에 삽입된 것만   삭제할 수 있다.

  9) set과 multiset
  : 수학의 집합 개념과 유사하다. 각 항목은 유일하게 구분되어 2개 이  상 중복되어 존재할 수 없다. STL에서의 구현 방식 때문에 항목이 저  장될 때 순서를 가진다. 항목 개수의 로그스케일에 비례하는 삽입, 삭  제, 룩업 성능을 가진다. 삽입, 삭제는 vector보다 빠르지만 list보다   느리고, 항목 룩업 속도는 vector보다 느리지만 list보다 빠르다. 즉,   삽입, 삭제, 룩업 작업의 성능이 골고루 빨라야 하고 저장되는 항목이   순서를 가져야 한다면 set을 이용한다.

  10) map과 multimap
  : 키와 값의 쌍을 저장한다. 객체의 값이 아닌 키의 값에 근거하여 항  목의 저장 순서를 유지한다. multimap은 중복된 키 값을 허용하고 싶  을 때 사용한다.

  set과 map 컨테이너는 키와 값을 연관 지어 쌍으로 저장하기 때문에   연관 컨테이너라고 한다. set은 항목 자체가 키 역할을 한다. 저장되  는 항목들의 정렬 상태를 유지하기 때문에 순차 연관 컨테이너라고도 한다.

  11) 비순차 연관 컨테이너 - 해시 테이블
  : unordered_map, unordered_multimap, unordered_set,   unordered_multiset 정렬되지 않는다. 삽입, 삭제, 접근은 평균적으로   O(1)의 성능을 가진다. 항목에 대한 접근은 map이나 set보다 훨씬 빠르다.