C++ study <STL:Standard Template Library>
이 포스팅은 <공동환, 뇌를 자극하는 C++ STL>을 참고하여 써진 글입니다.
C++ 언어에서 제공되는 표준 라이브러리이며, 구성 요소는 다음과 같다.
⑴ 컨테이너 : 데이터(객체)를 저장하는 객체로 예를 들어, 벡터, 리스트, 스택 등이 있다.
⑵ 반복자 : 컨테이너가 담고 있는 요소에 접근하기 위한 포인터라고 할 수 있다. 반복자를 사용해서 컨테이너를 순회하거나 조작할 수 있다.
⑶ 알고리즘 : 정렬, 검색, 변형 등의 다양한 알고리즘을 제공한다. 알고리즘은 컨테이너에서 데이터를 처리하는 데 사용될 수 있다.
⑷ 함수 객체 : 함수처럼 동작하는 객체를 말하며, 알고리즘에 사용되는 정렬 기준이나 조건 등을 정의하는 데 사용된다.
함수 객체는 일반 함수와는 달리 상태를 가질 수 있고, 함수 호출 연산자인 ‘operator()’을 오버로딩하여 함수처럼 사용된다. (객체를 함수처럼 사용한다는 의미)
⑸ 어댑터 : 구성 요소의 인터페이스를 변경해 새로운 인터페이스를 갖는 구성 요소로 변경한다. 예를 들어서, 배열 컨테이너를 LIFO(후입선출)스택 컨테이너로 변환할 수 있다.
⑹ 할당기 : 컨테이너의 메모리 할당 정책을 캡슐화한 클래스 객체로 모든 컨테이너는 자신만의 할당기를 가지고 있다. 사용자 정의 할당기는 사용자가 직접 메모리 할당 방식을 제어할 수 있게 해준다. 프로그램 대부분 STL에서 제공하는 기본 할당기만으로 충분하기 때문에, 책에는 자세하게 다루지 않는다고 적혀있다.
==================================
⒜ 컨테이너는 두 가지 종류가 존재한다. ; [표준 시퀀스 컨테이너], [표준 연관 컨테이너]
[표준 시퀀스 컨테이너] : 컨테이터 원소가 자신만의 삽입 위치(순서)를 가지는 컨테이너.
삽입되는 순서에 따라 원소의 위치가 결정된다.
ex. vector, deque, list, array
(데크(deque)는 선입선출인 큐와 달리 양뱡향 큐로, 앞 뒤 양쪽 방향에서 요소를 추가하거나 제거하는 것이 가능하다.)
[표준 연관 컨테이너] : 저장 원소가 삽입 순서와 다르게 특정 정렬 기준에 의해 자동 정렬되는 컨테이너. 삽입 순서와 상관없이 위치가 결정된다.
ex. set, multiset, map, multimap
(map : 키와 값을 매핑해서 저장, multimap : map과 유사하지만 키 중복 가능, set : 키만 저장하며 중복값을 허용하지 않고 자동 정렬, multiset : set과 유사하지만 키 중복 가능)
Q. set은 자동 정렬인데 ‘특정 정렬 기준’을 가지는 표준 연관 컨테이너인 이유
: 키(이자 값)가 이진 트리의 특성으로 정렬되는 맥락에서 특정 정렬 기준을 가진다고 생각.
컨테이너는 데이터를 어떻게 저장하냐에 따라 나눠질 수 있다. ; [배열 기반 컨테이너], [노드 기반 컨테이너]
[배열 기반 컨테이너] : 데이터 여러개가 하나의 메모리 단위에 저장된다.
[노드 기반 컨테이너] : 데이터 하나가 하나의 메모리 단위에 저장된다.
컨테이너에 따라 메모리 사용, 지원 알고리즘이나 멤버 함수에 차이가 존재한다.
⒝ 반복자의 종류는 5가지가 존재한다. ; [입력], [출력], [전진], [양방향], [임의접근]
[입력;Input] : 읽기만 가능한 컨테이너를 순회할 때 사용된다. (istream)
operator*: 해당 위치의 요소에 접근
operator++: 다음 요소를 가리키도록 반복자를 증가
[출력;Output] : 쓰기만 가능한 컨테이너를 순회할 때 사용된다. (ostream)
operator*: 해당 위치의 요소에 값을 할당
operator++: 다음 요소를 가리키도록 반복자를 증가
[전진;Forward] : 입력과 출력의 모든 기능을 지원하지만, 단방향으로만 이동 가능하다.
[양방향;Bidirectional] : 전진 반복자의 모든 기능을 지원하며, 양방향으로 이동 가능하다.
추가로 operator--를 통해 이전 요소를 가리키도록 반복자를 감소
(list, set, map)
[임의 접근:Random Access] : 양방향 반복자의 모든 기능을 지원한다.
추가로 operator+, operator-, operator+=, operator-= 등을 통해 임의의 위치로 이동
(vector, deque)
ex. 배열과 같은 임의 접근이 가능한 컨테이너에는 임의 접근 반복자가 사용되며, 리스트와 같은 양방향 컨테이너에는 양방향 반복자가 사용된다.
begin()과 end()를 이용해서 컨테이너의 시작과 끝(마지막 요소)를 가리키는 반복자를 가져올 수 있다.
0 comments:
댓글 쓰기