C++언어에서 빼놓을 수 없는 부분이있다. 바로 STL(Standard Template Library)이다.
매우 다양한 부분에서 STL을 이용할 수 있으며 이는 개발 능률과 바로 연결되므로 매우 유용하다고 볼 수 있다.
오늘부터 몇일간 STL에 있는 컨테이너에 대해 하나하나 공부할 계획이다.
1. STL(Standard Template Library)?
STL이란 '표준 C++ 라이브러리'이다. 프로그램에 필요한 자료구조 및 알고리즘을 템플릿으로 제공한다.
STL의 구성요소는 여러가지가 있다.
- 컨테이너(Container)
- 반복자(Iterator)
- 알고리즘(Algorithm)
- 함수 오브젝트(Function Object) 등
자료들은 컨테이너에 있고 알고리즘은 하나의 수단이다. 이에 접근하기 위해선 반복자를 사용한다고 보면 된다.
이 구성요소를 크게 두개로 나누자면 컨테이너와 알고리즘으로 나눌 수도 있다.
그만큼 STL에서 중요한 요소인데 하나하나 살펴보도록하자.
2. STL - 컨테이너
STL 컨테이너는 객체(기본자료형과 사용자 정의 자료형)를 저장하는 자료구조이다.
클래스 템플릿으로 되어있으며 일반적으로 다음과 같이 나뉜다.
아래 컨테이너들의 자세한 내용에 대해선 추후 포스팅 해나갈 예정이다.
- 시퀀스 컨테이너(Sequence Container) : 일반적인 자료구조와 동일하며, 순차적으로 저장
- array : 배열
- vector : 동적 배열
- deque : 양방향 큐
- forward_list : 단방향 리스트
- list : 양방향 리스트
- 연관 컨테이너(Associative Container) : 일정규칙에 따라 조직화하여 자료를 정렬, 처리
- set : 중복아닌 key 집합
- map : 중복아닌 key, value 집합
- multiset : 중복되는 key 집합
- multimap : 중복되는 key, value의 집합
- 어댑터 컨테이너(Adepter Container) : 시퀀스 컨테이너를 변형하여 다음과 같이 저장
- stack : 스택
- queue : 큐
- priority_queue : 우선순위 큐
3. STL - 알고리즘
STL 알고리즘은 정렬과 같은 개발시 사용되는 기능을 함수 템플릿으로 만들어둔 것이다.
종류가 매우 다양하며 함수 몇몇개를 정리해보았다.
- sort() 알고리즘 : 지정된 정렬 기준에 따라 구간 요소들을 정렬
- find() 알고리즘 : 주어진 값에 일치하는 첫번째 요소 반환
- binary_search() 알고리즘 : 정렬된 컨테이너에 대한 이진 탐색 수행
- max() 알고리즘 : 두 객체 비교하여 큰 값 반환
- min() 알고리즘 : 두 객체 비교하여 작은 값 반환
- replace() 알고리즘 : 지정된 범위 내에 특정 값을 갖는 원소를 찾아 값을 변경
4. STL 반복자
STL 반복자를 사용하여 컨테이너에 저장되어있는 원소들을 접근할 수 있다.
컨테이너와 알고리즘이 함께 동작하도록 만들어주는 역할을 한다. 몇몇가지 연산들을 살펴보겠다.
- begin() 연산자 : 컨테이너에서 첫번째 요소를 반환
- end() 연산자 : 컨테이너의 끝을 표시하는 원소를 반환(마지막의 다음 주소를 가진다.)
- ++, -- 연산자 : ++는 컨테이너에서 다음 요소를 가리킴, --는 이전 요소를 가리킴
- !=, == 연산자 : !=, ==는 두개의 반복자가 같은 요소 가리키는지 확인
- * 연산자 : 반복자가 가리키는 요소의 값을 보여주는(역참조) 연산자
5. 실습
위 시퀸스 컨테이너중 하나인 vector와 연산자를 이용하여 실습을 진행한다.
vector는 뒷 포스팅에서 설명하겠지만 가변적인 배열을 사용하기 위해 사용한다.
순차적이기때문에 읽는 것은 빠르지만 배열 길이가 길어질수록 데이터 처리 속도가 느려진다는 단점이있다.
이제 vector를 이용하여 원소를 push, pop하고 연산자를 이용하여 출력하는 것을 실습해보자(주석 참고).
#include <iostream>
#include <vector>
using namespace std;
int main(void) {
vector<int> vec; //동적 배열 vector
vec.push_back(1); //vector에 1 push
vec.push_back(2); //vector에 2 push
vec.push_back(3); //vector에 3 push
vector<int>::iterator vecit = vec.begin(); //연산자 선언과 동시에 vec의 첫번째 값 0을 가리킴
cout << vec[0] << endl; //vec의 첫번째 값 1 출력
vecit++; //연산자가 다음 요소 가리킴(0 -> 1)
cout << *vecit << endl; //참조 값 출력
vecit++; //연산자가 다음 요소 가리킴(1 -> 2)
cout << *vecit << endl; //참조 값 출력
//vec.pop_back(); //마지막 값 pop(3 out)
for (vecit = vec.begin(); vecit != vec.end(); ++vecit) { //vec의 첫요소부터 끝까지 순환, 연산자 1씩 증가
cout << *vecit << endl; //연산자가 참조하는 값 출력(1, 2, 3)
}
return 0;
}
여기까지 STL 공부를 마친다. 뒤부턴 vector부터 하나하나 STL에 대한 포스팅을 진행할 예정이다.
'Programming > Language' 카테고리의 다른 글
[C++] STL - list 공부 (0) | 2020.05.07 |
---|---|
[C++] STL - vector 공부 (0) | 2020.05.06 |
[C++] 템플릿(Template) 공부 (0) | 2020.05.04 |
[C++ 프로그래밍 책 정독 4일차] 9장-10장 개인 정리 및 이해 (0) | 2020.02.26 |
[C++ 프로그래밍 책 정독 3일차] 7장-8장 개인 정리 및 이해 (0) | 2020.02.25 |