29장. 템플릿과 STL 01_ 템플릿 02_ STL
템플릿 클래스의 사용(1) 모든 타입의 배열을 위한 스마트 포인터 클래스 template <typename T> class AutoArray { public: AutoArray(T* ptr) _ptr = ptr; } ~AutoArray() delete[] _ptr; T& operator[] (int index) return _ptr[index]; private: T* _ptr; }; int main() AutoArray<float> arr( new float [100] ); arr[0] = 99.99f; return 0;
템플릿 클래스의 사용(2) 템플릿 클래스의 객체를 생성하는 순간에 컴파일러 내부적으로 알맞은 클래스를 만든다. 개발자가 만든 코드 컴파일러에 의해 생성된 클래스 template< typename A, typename B, int MAX > class TwoArray { // 중간 생략 A arr1[ MAX ]; B arr2[ MAX ]; }; TwoArray< char, double, 20 > arr; class TwoArray_char_double_20 // 이 이름은 임의로 만든 것 { // 중간 생략 char arr1[ 20 ]; double arr2[ 20 ]; };
템플릿 클래스의 사용(3) 템플릿 매개 변수의 사용 [29-1]
템플릿 함수의 사용 모든 타입을 위한 max() 함수 template<typename T> T max(T a, T b) { return (a > b ? a : b); } int main() int i1 = 5, i2 = 3; int i3 = max(i1, i2); // i3 = 5 double d1 = 0.9, d2 = 1.0; double d3 = max(d1, d2); // d3 = 1.0 return 0;
템플릿 사용 시 유의할 점 템플릿은 컴파일 시간에 코드를 만들어낸다. 템플릿 함수의 정의는 헤더 파일에 놓여야 한다. 그렇기 때문에 템플릿의 사용으로 인한 속도 저하는 생기지 않는다. 하지만, 컴파일 시간이 오래 걸리는 단점이 있다. (하지만 크게 문제가 될 정도는 아님) 템플릿 함수의 정의는 헤더 파일에 놓여야 한다. 컴파일 시간에 클래스나 함수를 만들어내기 위해서는 헤더 파일에 위치할 필요가 있다. (컴파일 시간에는 다른 구현 파일의 내용을 확인할 수 없다. )
STL 컨테이너(1) list 클래스를 사용하는 예 #include <list> #include <iostream> int main() { // int 타입을 담을링크드 리스트 생성 std::list<int> intList; // 1 ~ 10까지 링크드 리스트에 넣는다. for (int i = 0; i < 10; ++i) intList.push_back( i); // 5를 찾아서 제거한다. intList.remove( 5); // 링크드 리스트의 내용을 출력한다. std::list<int>::iterator it; for (it = intList.begin(); it != intList.end(); ++it) std::cout << *it << "\n"; return 0; }
STL 컨테이너(2) list 클래스의 탐색 [29-2]
STL 컨테이너(3) 자주 사용하는 STL의 컨테이너 클래스 [표 29-1]
STL 알고리즘(1) sort() 함수를 사용하는 예 #include <algorithm> #include <vector> #include <iostream> int main() { // 동적 배열을 생성해서 임의의 영문자를 추가한다. std::vector<char> vec; vec.push_back( 'e'); vec.push_back( 'b'); vec.push_back( 'a'); vec.push_back( 'd'); vec.push_back( 'c'); // sort() 함수를 사용해서 정렬한다. std::sort( vec.begin(), vec.end() ); // 정렬 후 상태를 출력한다. std::cout << "vector 정렬 후\n"; std::vector<char>::iterator it; for (it = vec.begin(); it != vec.end(); ++it) std::cout << *it; return 0; }
STL 알고리즘(1) 자주 사용하는 STL의 알고리즘 함수 [표 29-2]