18
C++ template

C++ Template/STL study

Embed Size (px)

Citation preview

Page 1: C++ Template/STL study

C++ template

Page 2: C++ Template/STL study

C++ template

공텍쥐페리와 어린 기획자

공텍쥐페리는 비행을 하다가 어떤 프로젝트에 불시착했어요. 거기에서 만난 어린 기

획자는 그에게 말했습니다 “큰 숫자를 리턴하는 함수 하나만 만들어 줘…”

공텍쥐페리는 어린 기획자에게 int를 인자로 받는 함수를 만들어 주었어요. 그러자 어

린 기획자는 함수를 내던지며 “아냐, 내가 원하는 자료형은 이런 게 아냐. 소수점 이

하 숫자를 비교할 수 없잖아"라고 말했어요.

그래서 공텍쥐페리는 float를 인자로 받는 함수를 만들어 주었어요. 그런데 어린 기획

자는 또 투정을 부리며 “난 글자도 비교하고 싶어, 이딴 자료형은 필요 없어!”

화가 난 공텍쥐페리는 아무렇게나 상자 하나를 그려놓고 이렇게 말했어요 “이 상자

안에 네가 원하는 자료형이 있어“

그러자 어린 기획자는 밝은 미소를 지으며 함수를 가지고 떠났답니다.

Page 3: C++ Template/STL study

C++ template

공텍쥐페리와 어린 기획자

함수를 만들 때, 다양한 자료형을 인자로 받아야 하는 경우

각각 다른 자료형의 데이터를 인자로받는 함수를 일일히 ctrl+c ,ctrl+v 해야할까?

좀 더 똑똑하게 코딩할 수는 없을까?

왜 없겠습니까! 있지요!

Page 4: C++ Template/STL study

Template function

템플릿

여러 다른 자료형을 템플릿 인자로 받아 함수, 클래스, 구조체 내부에서 활용할 수 있도록 한 것

template <typename Type> <-함수 템플릿

Type max(Type a, Type b){ …} <-템플릿 함수

컴파일 과정 중 해당 함수가 어떤 자료형으로 호출될 지 결정되어실제 자료형으로 함수가 생성된다.

단, 하나의 typename은 하나의 자료형으로만 취급된다.

Page 5: C++ Template/STL study

Example #1

Page 6: C++ Template/STL study

Example #2

Page 7: C++ Template/STL study

Template class

템플릿 클래스

템플릿을 사용한 클래스(간단)

template <typename T> class Stack{…}; <-선언시

Stack<int> myStack; <-사용시

템플릿 함수와 달리 컴파일러가 인자를 추론해주지 않음, 클래스 사용 시 명시적으로 인스턴스화 해주어야 한다

Page 8: C++ Template/STL study

Example #3

일반적인 방식으로 클래스 함수의 선언과 정의를분리할 경우 컴파일 되지 않는다.

*.inl(inline) 파일에 함수를 정의하고 헤더 파일에서포함해줘야 함!

Stack.h

Stack.inl

Page 9: C++ Template/STL study

Supplement

주의할점

함수 템플릿과 템플릿 함수(클래스)는 한 몸!

함수의 선언과 정의를 분리할 경우 함수 선언시에 template도 함께 선언해야 함

class, typename 둘 다 사용 가능하지만 좀 더 의미가 명확한 typename을 사용하는 것이 좋다

컴파일 시점에서 코드를 생성하기 때문에 당연하게도 남발하면 컴파일 시간이 길어진다

Page 10: C++ Template/STL study

Template metaprogramming

논 타입 템플릿

템플릿 인자로 자료형이 아닌 non-type 파라미터를 지정할 수 있다.

템플릿 함수 내부에서 상수처럼 사용된다

template <int N> int factorial(){…}; <- 선언

factorial<10>(); <- 상수만 입력 가능

Template metaprogramming

컴파일 시점에 코드를 생성하는 template의 특성을 이용해 복잡한계산을 필요로 하는 함수를 컴파일 시점에 계산하도록 하여 실행시간을 보다 빠르게 하는 프로그래밍 기법

Page 11: C++ Template/STL study

Example #4

일반적인 재귀함수로 구현할 경우 런타임시점에 계산됨

템플릿 메타프로그래밍 기법 사용시 컴파일 시점에 계산되어 런타임 시점에서는상수처럼 사용됨

Page 12: C++ Template/STL study

Supplement

Non-type 파라미터는 정수, 상수형 값(열거형 포함), 외부 링크를 가진객체에 대한 포인터만 사용 가능하다

응? 또 뭔가 쓸 게 있었는데 콜라 사오는 동안 까먹었다

Page 13: C++ Template/STL study

Standard template library

STL

C++ 템플릿을 사용해 만든 표준 라이브러리

일반적인 자료 구조 컨테이너와 알고리즘이 구현되어 있음

vector, deque, list, map, set, stack, queue

bitset, algorithm, functional, iterator

자료구조에 대해서는

Page 14: C++ Template/STL study

컨테이너

기본적인사용법

vector, deque, list, stack, queue <- 시퀸스 컨테이너

Map, hash_map set <- 연관 컨테이너

std::vector<int> myVector;

std::map<double,int> myMap;

컨테이너별로 사용 가능한 멤버가 다름, 검색하면 나옴

Page 15: C++ Template/STL study

Itorator

Itorator컨테이너 내부의 요소를 순회하는 방법을 캡슐화한 객체

컨테이너의 포인터라고 생각하면 됨

증감 연산자와 비교 연산자, * ->연산자 사용 가능

list<int>::iterator myIter;

Iterator – 순방향으로 순회

const_iterator – 읽기 전용으로 순회

reverse_iterator – 역방향으로 순회

const_reverse_iterator – 읽기 전용 역방향으로 순회

Page 16: C++ Template/STL study

Algorithm

어디 쓰는 물건인가요?

템플릿 함수로 구현된 알고리즘 라이브러리

STL 컨테이너 뿐만 아닌 일반 배열 구조도 사용 가능

변경 불가 시퀀스 알고리즘 (find, for_each …)

변경 가능 시퀀스 알고리즘 (generate, copy, remove, replace …)

정렬 관련 알고리즘 (sort, binary_search, merge)

범용 수치 알고리즘 (accumulate, inner_product)

Page 17: C++ Template/STL study

Example #5

Page 18: C++ Template/STL study

Example #6