1 / 17

C++ 프로그래밍의 이해

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.

Télécharger la présentation

C++ 프로그래밍의 이해

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C++ 프로그래밍의 이해 Standard Template Library 김호권 ghrnjs@compiler.korea.ac.kr Compiler and Advanced Computer Systems Lab Korea University, Seoul, Korea

  2. Schedule

  3. Index • Template • Container • STL

  4. Template • data type만 다른 overloaded 함수에 대해서 각각을 구현하기 보다는 어떤 방법으로 간단하게 할 수 없을까?  template • 다양한 변수형(type) 에 적응적인 코딩이 가능하게 하는 문법이다.  generic • template < type _typename >

  5. 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; }

  6. 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

  7. STL • STL (Standard Template Library) 이란, 1997년 C++ 표준안이 확정될 때에 함께 배포된 표준 라이브러리(Standard Library) 의 일부분을 지칭하는 용어이다. • 단순한 표준화된 클래스 라이브러리가 아니라 모든 것이 Template으로 구성된 라이브러리.

  8. Why STL? • 전용의 함수 혹은 전용의 자료구조가 아닌 일반적으로 사용 가능한 함수 혹은 자료구조를 만들기 위해서이며, 이러한 일반적인 자료구조에 일반적인 알고리즘을 적용시키기 위해서 이다. • 간단히 말해서, 프로그래밍 시간을 극적으로 단축시키고 코드 수를 줄이고 유지보수 쉽고 확장 쉬운 코드를 만들기 위해서이다

  9. STL Advantage • 장점으로는 우선 소스크기의 축소를 들 수 있다. 이미 STL에는 자주 사용되는 50여개 정도의 알고리즘과 다양한 데이타 구조들을 가지고 있다. 우리는 이러한 STL에서 사용하는 자료구조와 알고리즘을 이용해서 소스코드의 크기를 획기적으로 줄일 수 있다. • STL 알고리즘과 컨테이너들은 기존의 C/C++ 의 포인터와 배열에도 사용할 수 있으며, 변환 가능하므로 유연하게 사용 가능하다. 그리고 컨테이너와 알고리즘이 서로 분리되어 있음으로(많은 경우), 자신이 알고리즘을 만들어서 컨테이너에 적용시키는 작업이 가능하다. • 대부분의 알고리즘과 자료구조들은 충분히 테스트되고 최적화 되어 있다. 또한 효율적인 프로그래밍을 위한 다양한 접근 방법을 제공하므로, C++ 을 사용한 STL 이 느릴 것 이라는 예상을 깨고 약간만 신경을 쓴다면 매우 효율적인 코드를 생성할 수 있다.

  10. STL Disadvantage • 우선 디버깅이 어렵다. STL을 잘못사용할경우 발생되는 컴파일시의 에러코드는 template에 있는 내부함수들의 에러들을 출력시킨다. 이러한 에러가 발생하면 일단 에러메시지의 양들도 많을 뿐더러, 이해자체가 어려운 메시지들이다. 이걸 해결하는 방법은 하나뿐이다. STL 에 익숙해지기.. • STL이 유연성을 구현하기 위한 template의 경우 프로그램의 크기를 매우 크게 만들수 있다. 아직은 컴파일러가 template을 그리 효율적으로 처리하지 못하기 때문이다. 역시 비용을 잘 고려하여서 효율적으로 STL의 알고리즘과 컨테이너들을 사용해야 한다. • 반복자와 컨테이너가 분리되어서 존재한다. 이는 쓰레드 프로그래밍시 문제를 발생할 소지를 가지고있다.

  11. STL • STL 은 다음의 요소로 구성된다. • Container (컨테이너) • Iterator (반복자) • adaptor (접속자) • 대표적인 Container • Vector / List / Deque / Map / string • *** Tree 는 제공되지 않는다.

  12. STL Container • STL 을 설명하면서 등장하는 컨테이너(저장소)란 객체를 원소로 저장할수 있는 영역을 말한다. 이는 특정 데이타 타입만을 저장할 수 있는 배열과는 상당히 다른 개념이다. 객체란 묘사될 수 있는 모든 사물을 말한다. 이러한 객체를 원소로 저장할 수 있다는 특성 때문에 컨테이너는 모든 종류의 데이터 저장이 가능하도록 되어있다. 이러한 특성은 앞에서 언급했듯이 C++ Template 을 이용해서 구현된다.(더 자세히 말하자면 Class Template). • STL 은 다양한 자료구조로 사용될 수 있는 약 10가지 정도의 컨테이너들을 제공한다. 여기에는 배열을 일반화 시킨 vector, queue 로 사용 가능한 deque, 요소를 가르키는 첨자로 int 형 대신에 다른 형(char * 이나 string)을 사용할 수 있는 map 등이 있으며, 이러한 다양한 컨테이너들을 사용하여서 쉽게 확장 가능한 자료구조를 단 몇 줄의 코딩으로 쉽게 구현할 수 있다. • 이러한 10가지 정도 되는 컨테이너들은 다시 Sequence 컨테이너와, Association 컨테이너로 크게 나눌 수 있다.

  13. 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

  14. 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

  15. 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

  16. 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

  17. Q&A • Q&A

More Related