stl study (skylab)

13
STL in C++

Upload: gyeongwook-choi

Post on 19-Jun-2015

313 views

Category:

Technology


0 download

DESCRIPTION

STL in C++ basic

TRANSCRIPT

Page 1: STL study (skyLab)

STL in C++

Page 2: STL study (skyLab)

STL = Standard Template Library

Page 3: STL study (skyLab)

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의자료형에 상관없이더작은값이리턴된다.

Page 4: STL study (skyLab)

앞에서 본 것은 템플릿을 이용해서 함수를 만들었으므로 템플릿 함수라고 한다.그리고 같은 기능을 클래스에도 적용시킬 수 있는데, 이 경우를 템플릿 클래스라고 한다.

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와 같은기본자료형은 물론이고, 프로그래머가 새로정의한클래스나포인터형도 가능하다.

Page 5: STL study (skyLab)

앞의 예제를 응용해서 좀 더다양한 템플릿 클래스를 만들 수있다.

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]

가생성된다.

Page 6: STL study (skyLab)

신기한 기능인만큼 템플릿에는 몇 가지 특징이 있다.

1. <class T> 대신에 <typename T>를쓸수도있다. 둘은동일하다.

2. Template은런타임에생성되는것이아니라컴파일할때만들어진다. 그래서아주많이사용하면컴파일이오래걸린다. (하지만별로중요하지는않다.)

3. 중요한것은 template function은항상헤더파일에놓아야한다는것이다. 그이유는 template function은함수를만드는방법을선언하는것이기때문이다.그리고만약 template function에서호출하는함수가있다면, 그함수역시헤더파일에정의되어있어야한다.

Page 7: STL study (skyLab)

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);

Page 8: STL study (skyLab)

그외에도 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를 대상이되는 리스트로복사하고조건에 따라서새로정렬

Page 9: STL study (skyLab)

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를예로 들면

Page 10: STL study (skyLab)

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를예로 들면

Page 11: STL study (skyLab)

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

Page 12: STL study (skyLab)

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에서 관련정보를 찾을수있다.

Page 13: STL study (skyLab)

find() // 선형 검색 알고리즘

replace() // 특정한 값을 갖는 element를 찾아서 입력한 값으로 교체

reverse() // 원소들의 순서를 반대로 뒤집는다

binary_search() // 원소들이 정렬되어 있을 때 사용할 수 있으며, 좀 더 빨리 원하는 데이터를 찾을 수 있다

***관련 msdn 페이지

http://msdn.microsoft.com/en-us/library/vstudio/wh15hsex(v=vs.100).aspx

자주 쓰이는 Algorithms