stl study (skylab)
DESCRIPTION
STL in C++ basicTRANSCRIPT
STL in C++
STL = Standard Template Library
Template자료형은 다르지만 내부 작동은 비슷한 클래스나 함수들을 여러 번 작성하지 않고 한번만 작성할 수 있게 해주는 기능
int min( int a, int b ){
return ( a < b ) ? a : b;}
만약위와같은함수가 있을때, 자료형이 float인 두 변수중에서작은값을얻으려면
float min( float a, float b ){
return ( a < b ) ? a : b;}
float형을 위한함수를 오버로딩해야한다.
그런데두함수의 자료형을제외하면똑같은 함수이다.이럴때작업을간단하게 만들어주는것이 템플릿기능
template <class T> T min ( T a, T b ){
return ( a < b ) ? a : b;}
여기서 template라는 것은이함수가 template 함수라는뜻이고, <class T>는 T라는 자료형을이함수에서 사용하겠다는것을의미한다.
여기서의 T는 a와 b의자료형이 무엇인지지금은알수없지만함수가호출될 때 a와 b의자료형을 T라고 하겠다는뜻이다.
그래서 min(a, b)하면 a, b의자료형에 상관없이더작은값이리턴된다.
앞에서 본 것은 템플릿을 이용해서 함수를 만들었으므로 템플릿 함수라고 한다.그리고 같은 기능을 클래스에도 적용시킬 수 있는데, 이 경우를 템플릿 클래스라고 한다.
template <class T> class A{
T m_t;public:
A(T t): m_t(t) {}void f(T t);
};
위의예제코드에서 알수있듯이템플릿함수와 거의동일한방식으로사용할 수있다. 다만템플릿함수에서는 <class T>로정의한자료형을 자동적으로인식한 반면에템플릿클래스는클래스를생성할 때는아래와같이자료형을 명시해줘야하는차이점이있다.
A<int> a(10);
예시와같인자료형을 int로선언하면생성되는 class A는다음과동일하다.
class A{
int m_t;public:
A(int t): m_t(t) {}void f(int t);
};
이때 < > 안에들어갈수있는자료형은 int나 float와 같은기본자료형은 물론이고, 프로그래머가 새로정의한클래스나포인터형도 가능하다.
앞의 예제를 응용해서 좀 더다양한 템플릿 클래스를 만들 수있다.
template <class A, class B, int MAX>class TwoArray{
// blah blah
A arr1[MAX];B arr2[MAX];
// blah blah
};
위와같이 < > 안에다양한조건을 명시할수도있다.
예를들어서앞의 TwoArray라는 클래스를다음과같이 생성하면
TwoArray<int, char, 10> a;
class A에는 int가, class B에는 char가, int MAX에는 10이라는값이할당되어서
a라는 객체안에는
Int arr1[10]char arr2[10]
가생성된다.
신기한 기능인만큼 템플릿에는 몇 가지 특징이 있다.
1. <class T> 대신에 <typename T>를쓸수도있다. 둘은동일하다.
2. Template은런타임에생성되는것이아니라컴파일할때만들어진다. 그래서아주많이사용하면컴파일이오래걸린다. (하지만별로중요하지는않다.)
3. 중요한것은 template function은항상헤더파일에놓아야한다는것이다. 그이유는 template function은함수를만드는방법을선언하는것이기때문이다.그리고만약 template function에서호출하는함수가있다면, 그함수역시헤더파일에정의되어있어야한다.
STL일반적으로 사용하는 기능들을 앞에서 살펴본 template 기능을 이용해서 미리 만들어 놓은 것종류에는 STL Containers, Iterators, Algorithms, Allocators, Function Object가있다.
STL Containers자료구조라고생각하면편하다. 사용법들이비슷하니 linked list를통해살펴보자.
// 사용하기 위해서는 라이브러리를 불러와야 된다
#include <list>
// 하나 생성하자// template에서 본 문법이 그대로 적용된다. // 생성한 리스트가 저장할 데이터 타입을 < > 안에 적어주면 된다.
std::list<int> intList;
// 리스트에 element를 추가해보자// 여기서 사용한 push_back()은 리스트의 맨 뒤에 자료를 추가하는 것
intList.push_back(5);
// 그럼 이제 추가된 값들 중에 5를 저장하고 있는 노드를 지워보자
intList.remove(5);
그외에도 STL에는 다양한 멤버함수들이 있다. list를예로 들면
assign // 기존에 있던 elements를 삭제하고새로운 elements로 대체
list::clear // 리스트의 모든 elements 광역삭제
empty // 리스트가 비어있는지확인
max_size // 리스트의 최대크기반환
get_allocator // 리스트를 생성하는데사용된 allocator를 복사해서반환
resize // 리스트의 크기를새로지정
(더길어지면길어진자리는 기본값들로채워지고, 더짧아지면짧아진길이보다뒤에 있던 elements는지워짐)
reverse // 리스트의 elements의 순서를뒤집는다
size // 지금 리스트의 크기 반환
sort // 주어진 조건에따라서 elements를 정렬
splice // 리스트에서 삭제한 element를 대상이되는리스트에 삽입
swap // 두리스트의 elements를 서로바꾼다
unique // 리스트에서 중복된값을가지거나 주어진조건에만족하는 지는 elements를 삭제
merge // 지정된 리스트의 elements를 대상이되는 리스트로복사하고조건에 따라서새로정렬
front // 리스트의 첫 번째 element에 대한 reference 를 반환
back // 리스트의 마지막 element에 대한 reference 를 반환
begin // 리스트의 첫 번째 element에 대한 iterator를 반환
list::cbegin // 리스트의 첫 번째 element에 대한 const iterator를 반환
end // 리스트의 마지막 element에 대한 iterator를 반환
list::cend // 리스트의 마지막 element에 대한 const iterator를 반환
rbegin // 리스트의 역순에서 첫 번째 element에 대한 iterator를 반환
list::crbegin // 리스트의 역순에서 첫 번째 element에 대한 const iterator를 반환
rend // 리스트의 역순에서 마지막 element에 대한 iterator를 반환
list::crend // 리스트의 역순에서 마지막 element에 대한 const iterator를 반환
그외에도 STL에는 다양한 멤버함수들이 있다. list를예로 들면
list::emplace // 특정한 위치에 element 삽입
list::emplace_back // 리스트의 맨 뒤에 elements 추가
list::emplace_front // 리스트의 맨 앞에 elements 추가
insert // 리스트의 특정한 위치에 하나 혹은 다수의 element를 삽입
push_back // 리스트의 맨 뒤에 element 추가
push_front // 리스트의 맨 앞에 element 추가
erase // 리스트의 특정한 위치에 있는 element 하나 혹은 다수를 삭제
pop_back // 리스트의 맨 뒤 element 삭제
pop_front // 리스트의 맨 앞 element 삭제
remove // 입력한 값을 만족하는 elements 삭제
remove_if // 주어진 조건에 만족하는 elements 삭제
// operator
= // 리스트의 모든 element를 복사
그외에도 STL에는 다양한 멤버함수들이 있다. list를예로 들면
vector // 동적인 배열로써 원소의 개수를 동적으로 조절할 수 있다
deque // 접근시간은 array, 추가 삭제 시간은 linked list인 자료구조
map // key를 통해서 value에 접근하는 자료구조, key와 value 모두 데이터 타입을 지정할 수 있다
***관련 msdn 페이지
http://msdn.microsoft.com/en-us/library/vstudio/1fe2x6kt(v=vs.100).aspx
자주 쓰이는 STL container
Algorithms말그대로알고리듬으로써 정렬, 찾기, 순서바꾸기등의기능을제공한다. 사용방법은 STL container와 비슷하지만 개별알고리듬을 include하지 않고한번에전체를 include한다.
// 다음과같이 include해주고
#include <algorithm>
// 이렇게사용하면된다.
std::sort(first, last);
여기서사용된 sort()는 first에서 last까지의 데이터가 오름차순으로 정렬되는데,
평균적인시간 복잡도는 N = last – first일 때, O(N log N)이다.
주의할점은 sort()는 stable한 알고리듬이아니므로 stable한 정렬결과를원한다면 stable_sort()를 사용해야한다.
이와같이각각의 알고리듬의특징은 msdn에서 관련정보를 찾을수있다.
find() // 선형 검색 알고리즘
replace() // 특정한 값을 갖는 element를 찾아서 입력한 값으로 교체
reverse() // 원소들의 순서를 반대로 뒤집는다
binary_search() // 원소들이 정렬되어 있을 때 사용할 수 있으며, 좀 더 빨리 원하는 데이터를 찾을 수 있다
***관련 msdn 페이지
http://msdn.microsoft.com/en-us/library/vstudio/wh15hsex(v=vs.100).aspx
자주 쓰이는 Algorithms