[c++]STL이란?
평소 알고리즘 문제를 풀면서 STL을 지양하면서 직접 자료구조를 만들어서 (예를들어 queue나 stack 같은..) 구조를 이해하며 문제에 적용시켜 푸는 것을 즐겼다. 하지만 우선순위 큐를 이용하거나 다익스트라 알고리즘이 필요한 문제들이 나오면 어떻게해야할지 막막해졌다. 그래서 STL을 공부해보기로 한다.
STL
그렇다면 STL은 무엇일까?
STL이란 Standard Template Library의 약자로 표준 라이브러리이다.
컨테이너(Container, 자료구조) Class/ 반복자/ 알고리즘간의 협력에 기반한 템플릿 라이브러리이다.
STL없이 알고리즘을 작성할 때 내 입맛에 맞춰 작성하여 문제를 푸는 일이 생각보다 까다롭고 변수 타입에따라 여러가지 벽에 부딪히기도 했다.
C++은 template라는 것을 통해서 한 가지 타입에 특정되지 않고, 여러 타입에 일반적인 문법을 사용할 수 있다.
2019-09-03 추가 *** 보통 c++ STL을 일컷는다면 다음과 같은 세 개의 라이브러리들을 의미한다.
- 임의 타입의 객체를 보관할 수 있는 컨테이너(container)
- 컨테이너에 보관된 원소에 접근할 수 있는 반복자(iterator)
- 반복자들을 가지고 일련의 작업을 수행하는 알고리즘(algorithm)
Container 종류
- Sequence Container(순차 컨테이너)
- <array> 배열
- <vector> 동적배열
- <deque> 데크 (양방향 큐)
- <forward_list> 단방향 리스트
- <list> 양방향 리스트
- Associative Container(정렬 연관 컨테이너)
- <set> 정렬된 유일 key 집합
- <map> 정렬된 유일 key와 value의 집합
- <multiset> 정렬된 중복허용 key 집합
- <multimap> 정렬된 중복허용 key와 value의 집합
- Container Adaptor(컨테이너 어댑터)
- <stack> 스택
- <queue> 큐
- <priority_queue> 우선순위 큐
구조
1. Iterator(반복자)
STL전용 포인터, 가리키는 원소에 접근하여 다음 원소를 가리킨다.
2. Algorithm(알고리즘)
정렬, 삭제, 검색, 연산 등을 간단하게 호출하여 구성 가능
3. Allocator(할당기)
컨테이너의 메모리 할당 정책을 캡슐화한 클래스 객체로 모든 컨테이너는 자신만의 할당 크기를 가지고 있다.
4. Function Object(함수 객체)
함수처럼 동작하는 객체, operatior()연산자를 오버 로딩.
5. Adaptor (어댑터)
구성 요소의 인터페이스를 변경하여 새로운 인터페이스를 갖는 구성 요소로 변경.
Class(클래스)
STL의 구조를 좀 더 자세히 알아보기 위하여 클래스를 좀 더 자세히 알아보자.
#include<iostream>
using namespace std;
class Sum{
int total; //상태 변수
public:
explicit Sum(int n=0) : total(n){} // 생성자
int operator()(int n) //함수 연산자 오버로딩 -> 클래스를 함수처럼 사용
{
return total +=n;
}
};
int main(){
Sum sum(0); //total = 0 으로 초기화
cout << sum(10) << endl; // total +=10
cout << sum(100) << endl; // total +=100
return 0;
}
explicit
: 명시적으로 함수를 사용할 수 있도록 함
iterator(반복자)
반복자는 컨테이너에 저장된 원소를 순회하고 접근하는 일반화된 방법을 제공한다.
반복자는 컨테이너와 알고리즘이 하나로 동작하게 묶어주는 인터페이스 역할을 한다.
이 반복자 덕에 알고리즘은 특정 컨테이너에 종속적이지 않고 독립적이면서도 언제든지 컨테이너와 결합하여 동작할 수 있다.
- 반복자는 컨테이너 내부의 원소(객체)를 가리키고 접근할 수 있어야 한다.(* 연산자)
- 반복자는 다음 원소로 이동하고 컨테이너의 모든 원소를 순회할 수 있어야 한다.(++, !=, == 연산자 제공)
2019-09-03 추가
참고
https://boycoding.tistory.com/124
https://codingplus.tistory.com/13
https://modoocode.com/223
댓글남기기