170 likes | 471 Views
C++ 프로그래밍의 이해. Standard Template Library 김호권 ghrnjs@compiler.korea.ac.kr C ompiler and A dvanced C omputer S ystems L ab K orea U niversity, Seoul, Korea. Schedule. Index. Template Container STL. Template.
E N D
C++ 프로그래밍의 이해 Standard Template Library 김호권 ghrnjs@compiler.korea.ac.kr Compiler and Advanced Computer Systems Lab Korea University, Seoul, Korea
Index • Template • Container • STL
Template • data type만 다른 overloaded 함수에 대해서 각각을 구현하기 보다는 어떤 방법으로 간단하게 할 수 없을까? template • 다양한 변수형(type) 에 적응적인 코딩이 가능하게 하는 문법이다. generic • template < type _typename >
Template • min() 예제 #include <iostream> using std::cout; using std::endl; template <class Type> Type min( Type a, Type b ) { return a < b ? a : b; } int main() { int a, b; a =3; b =5; cout << "min : " << min(a,b) << endl; return 0; }
float Min_float( float a, float b ) { return (a<b?a:b); } Template < type _T > _T Min( _T a, _T b ) { return (a<b?a:b); } Int Min_int( int a, int b ) { return (a<b?a:b); } cUser Min_float( cUser a, cUser b ) { return (a<b?a:b); } Min < float > ( a, b ); Min < int > ( a, b ); Min < cUser > ( a, b ); Template
STL • STL (Standard Template Library) 이란, 1997년 C++ 표준안이 확정될 때에 함께 배포된 표준 라이브러리(Standard Library) 의 일부분을 지칭하는 용어이다. • 단순한 표준화된 클래스 라이브러리가 아니라 모든 것이 Template으로 구성된 라이브러리.
Why STL? • 전용의 함수 혹은 전용의 자료구조가 아닌 일반적으로 사용 가능한 함수 혹은 자료구조를 만들기 위해서이며, 이러한 일반적인 자료구조에 일반적인 알고리즘을 적용시키기 위해서 이다. • 간단히 말해서, 프로그래밍 시간을 극적으로 단축시키고 코드 수를 줄이고 유지보수 쉽고 확장 쉬운 코드를 만들기 위해서이다
STL Advantage • 장점으로는 우선 소스크기의 축소를 들 수 있다. 이미 STL에는 자주 사용되는 50여개 정도의 알고리즘과 다양한 데이타 구조들을 가지고 있다. 우리는 이러한 STL에서 사용하는 자료구조와 알고리즘을 이용해서 소스코드의 크기를 획기적으로 줄일 수 있다. • STL 알고리즘과 컨테이너들은 기존의 C/C++ 의 포인터와 배열에도 사용할 수 있으며, 변환 가능하므로 유연하게 사용 가능하다. 그리고 컨테이너와 알고리즘이 서로 분리되어 있음으로(많은 경우), 자신이 알고리즘을 만들어서 컨테이너에 적용시키는 작업이 가능하다. • 대부분의 알고리즘과 자료구조들은 충분히 테스트되고 최적화 되어 있다. 또한 효율적인 프로그래밍을 위한 다양한 접근 방법을 제공하므로, C++ 을 사용한 STL 이 느릴 것 이라는 예상을 깨고 약간만 신경을 쓴다면 매우 효율적인 코드를 생성할 수 있다.
STL Disadvantage • 우선 디버깅이 어렵다. STL을 잘못사용할경우 발생되는 컴파일시의 에러코드는 template에 있는 내부함수들의 에러들을 출력시킨다. 이러한 에러가 발생하면 일단 에러메시지의 양들도 많을 뿐더러, 이해자체가 어려운 메시지들이다. 이걸 해결하는 방법은 하나뿐이다. STL 에 익숙해지기.. • STL이 유연성을 구현하기 위한 template의 경우 프로그램의 크기를 매우 크게 만들수 있다. 아직은 컴파일러가 template을 그리 효율적으로 처리하지 못하기 때문이다. 역시 비용을 잘 고려하여서 효율적으로 STL의 알고리즘과 컨테이너들을 사용해야 한다. • 반복자와 컨테이너가 분리되어서 존재한다. 이는 쓰레드 프로그래밍시 문제를 발생할 소지를 가지고있다.
STL • STL 은 다음의 요소로 구성된다. • Container (컨테이너) • Iterator (반복자) • adaptor (접속자) • 대표적인 Container • Vector / List / Deque / Map / string • *** Tree 는 제공되지 않는다.
STL Container • STL 을 설명하면서 등장하는 컨테이너(저장소)란 객체를 원소로 저장할수 있는 영역을 말한다. 이는 특정 데이타 타입만을 저장할 수 있는 배열과는 상당히 다른 개념이다. 객체란 묘사될 수 있는 모든 사물을 말한다. 이러한 객체를 원소로 저장할 수 있다는 특성 때문에 컨테이너는 모든 종류의 데이터 저장이 가능하도록 되어있다. 이러한 특성은 앞에서 언급했듯이 C++ Template 을 이용해서 구현된다.(더 자세히 말하자면 Class Template). • STL 은 다양한 자료구조로 사용될 수 있는 약 10가지 정도의 컨테이너들을 제공한다. 여기에는 배열을 일반화 시킨 vector, queue 로 사용 가능한 deque, 요소를 가르키는 첨자로 int 형 대신에 다른 형(char * 이나 string)을 사용할 수 있는 map 등이 있으며, 이러한 다양한 컨테이너들을 사용하여서 쉽게 확장 가능한 자료구조를 단 몇 줄의 코딩으로 쉽게 구현할 수 있다. • 이러한 10가지 정도 되는 컨테이너들은 다시 Sequence 컨테이너와, Association 컨테이너로 크게 나눌 수 있다.
STL example 1 - string string s1 = “김호권”; string s2 = s1; printf( “%s”, s2.c_str() ); // 김호권 string s1 = “mark korea”; reverse( s1.begin(), s1.end() ); // aerok kram Printf( “%c”, s1.at(0) ); // m
STL example 2 - vector vector< int > nums;nums.insert( nums.begin(), -999 ); // -999nums.insert( nums.begin(), 14 ); // 14 -999nums.insert( nums.end(), 57 ); // 14 -999 57 for ( int i = 0; i < nums.size(); i++ ) cout << nums [ i ] << endl; // 14 -999 57 nums.erase( nums.begin() ); // -999 57nums.erase( nums.begin() ); // 57 nums [0] [1] [2] [3] 14 -999 57
STL example 3 - list list< string > names;names.insert( names.begin(), “Eric" ); // Eric names.insert( names.end(), “Samsik" ); // Eric Samsiknames.insert( names.begin(), “Daniel" ); // Eric Samsik Danielcout << *(names.begin()) << endl; // Ericnames.reverse(); // Daniel Samsik Eric names Eric Samsik Daniel
STL example 4 - map map < string, int >m;m[ "zero" ] = 0;m[ "one" ] = 1;m[ "phone of Samsik" ] = 12345;cout << m[ “one” ] << endl << m[ "phone of Samsik" ] << endl; // 112345 Hash Table 0 m 1 12345
Q&A • Q&A