SlideShare uma empresa Scribd logo
1 de 29
1부 
프로그래밍 기법들 
1.4 게임 프로그래밍에서의 STL 활용 (James Boer) 
Page 83 ~ 100 
NHN NEXT, NEXON 라태웅
STL(Standard Template Library)이 공식적으로 생겨난 때는 1997년 
STL은 컨테이너(데이터의 모음) 클래스들의 모음 
deque list queue 
map multimap set multiset bitset 
등이 존재함 
priority_qu 
eue 
stack vector 
컨테이너는 시퀀스 컨테이너와 결합 컨테이너로 나뉨 
시퀀스 컨테이너 
원소들이 직선 순서대로 배치 
결합(연관) 컨테이너 
레드 블랙 트리, 균형 이진 트리 형태특정 위치에 대한 삽입이 허용되지 않음
반복자 
컨테이너 안의 요소들에 대한 포인터와 비슷한 개념 
++ 연산자로 반복자를 컨테이너 안의 다음 요소로 옮기는 것 
* 연산자로 반복자를 역참조해서 실제 데이터를 얻어오는 것 
알고리즘 
STL 클래스들에 대해 작동하는 알고리즘, 독립적인 함수로 존재 
데이터와 알고리즘을 분리시키기 위해 컨테이너에 포함되지 않음
주요 개념 
컨테이너의 시작 
begin() 
컨테이너의 끝 
end() 
주의! end()는 마지막 요소가 아니라 마지막 요소 다음의 유효하지 않은 위치를 가리킴 
STL 컨테이너들은 정보를 참조(by ref)가 아닌 값(by val)으로 전달 
크기가 큰 구조체나 클래스라면 포인터를 넘겨주도록 하는 것이 바람직 
그렇지 않으면 매 번의 삽입, 접근마다 객체의 복사를 위해 생성자가 호출된다. 
begin() … … … … end() 
data data data data data none
벡터 
동적으로 크기를 변경할 수 있는 배열 
주기적으로 메모리를 재할당하고 새 배열로 데이터를 전송할 수 있는 배열 
“크기가 변할 수 있는 배열”이라 함은, 
필요한 양 이상의 메모리를 할당할 수 있음 
벡터의 끝에 하나의 요소를 추가하는 작업은 “상각된“ 상수적 시간 
공간이 꽉 찬 경우, 
새 메모리를 할당하고, 기존 메모리에 있는 배열을 새 메모리로 복사하고, 
기존 메모리를 해제하는 추가적인 시간과 자원이 소모 
메모리를 재할당하면 반복자들이 무효화 
새로운 메모리를 할당하고 기존 메모리를 해제하기 때문 
메모리 재할당이 언제 일어나는지 이해해야 함
c.reverse(10) 
none none none none none 
none none none none none
c.push_back(3) 
c.begin() 
3 
c.end() 
none 
none none none 
none none none none none
c.push_back(99) 
c.begin() 
3 
99 
c.end() 
none 
none none 
none none none none none
c.push_back(99) 
c.begin() 
3 
99 43 
c.end() 
none 
none 
none none none none none
c[0] = 12 
c.begin() 
12 
99 43 
c.end() 
none 
none 
none none none none none
c[1] = 32 
c.begin() 
12 
32 43 
c.end() 
none 
none 
none none none none none
c[2] = 999 
c.begin() 
12 
32 999 
c.end() 
none 
none 
none none none none none
리스트 
이중 연결 리스트(Double Linked List)로 구현됨 
어떠한 요소 삽입이나 삭제도 상수적인 시간으로 수행됨 
연결 리스트이기 때문에 벡터나 데크처럼 특정 요소에 임의 접근은 불가능 
벡터와 정확히 동일한 방식으로 사용 가능 
push_front(), push_back 등
데크 
컨테이너의 양 끝에서 요소의 삽입과 제거가 일어남 
컨테이너 중간에서는 요소의 삽입이나 제거가 잦지 않을 때 사용 
벡터와 마찬가지로 양 끝에서 삽입과 삭제는 상각된 상수적 시간이 걸린다 
큐 자체 내부 데이터의 본성 때문에 임의 접근이 가능하지만 벡터보다 비효율적 
시작점이 제일 처음 위치가 아니거나, 등등 
none data none 
양 끝에서 삽입과 삭제가 일어날 수 있기 때문에 위와 같은 상태일 수 있음 
벡터와 달리 추가적인 메모리 할당을 결정할 수 없음
맵 
Key-Value 쌍을 담는 컨테이너 
해시 테이블보다는 비효율적이지만 속도의 차이는 무시할 수 있을 정도 
삽입과 함께 정렬이 수행 
즉, map의 데이터는 항상 정렬된 상태로 존재 
Key를 통해 값을 조회하는 데 걸리는 시간은 O(log n) 
균형 이진 트리 형태(혹은 레드 블랙 트리)의 구조 
때문에 O(log n)의 시간이 걸린다
스택 
push(), pop(), top()의 기본적인 멤버 함수를 제공 
size()와 empty()로 현재 상태를 알 수 있다 
스택은 기본적으로 하나의 deque로 구현 
stack<int> c; // deque stack 
stack<int, vector<int>> c; // vector stack 
push_back, pop_back, back() 함수를 제공하는 어떠한 컨테이너라도 vector대신 사용 가능 
pop()이나 top()을 수행할 때 항상 검사해야 함 
안전성보다는 속도를 우선으로 설계 
pop()과 top()을 할 때 스택에 요소가 있는지 size()나 empty()로 미리 점검해 주어야 함 
큐와 우선 순위 큐도 마찬가지
큐 
push(), pop(), front(), back()의 기본적인 멤버 함수를 제공 
size()와 empty()로 현재 상태를 알 수 있다 
back()이 요소가 삽입될 위치이다 
큐 또한 기본적으로 deque를 사용하나 변경 가능 
vector는 앞쪽에서 요소를 추가하거나 제거하면 나머지 요소들이 모두 밀리거나 당겨짐 
때문에 vector는 비효율적 
우선 순위 큐 
큐와 동일하나 삽입과 동시에 내림차순으로 정렬 
< 연산자를 기반으로 정렬 
때문에 세번째 인자로 사용자 정의 비교 함수를 넣을 수 있음 
포인터를 넣었을 경우 주소값을 비교하기 때문에 필수적
결론 
STL의 장단점을 잘 이해하면 코드의 속도나 무결성을 훼손하지 않고 강력한 기 
능을 최대한 활용할 수 있다 
STL은 그 자체만으로 책 한 권을 쓸 수 있는 방대한 주제 
이 글을 통해서 STL의 가능성과 매력만을 맛볼 수 있기를 바람
참고 자료 
The C++ Standard Library: A Tutorial and Reference 
The C++ Programming Language 
Designing Components with the C++

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

[Commit Again] 1주차 STL study
[Commit Again] 1주차 STL study[Commit Again] 1주차 STL study
[Commit Again] 1주차 STL study
 
파이썬 크롤링 모듈
파이썬 크롤링 모듈파이썬 크롤링 모듈
파이썬 크롤링 모듈
 
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
이것이 자바다 Chap. 6 클래스(CLASS)(KOR)
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
파이썬정리 20160130
파이썬정리 20160130파이썬정리 20160130
파이썬정리 20160130
 
Start IoT with JavaScript - 5.객체2
Start IoT with JavaScript - 5.객체2Start IoT with JavaScript - 5.객체2
Start IoT with JavaScript - 5.객체2
 
Stl 컨테이너
Stl 컨테이너Stl 컨테이너
Stl 컨테이너
 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
 
[Swift] Iterator
[Swift] Iterator[Swift] Iterator
[Swift] Iterator
 
Reflect package 사용하기
Reflect package 사용하기Reflect package 사용하기
Reflect package 사용하기
 
Swift 0x17 generics
Swift 0x17 genericsSwift 0x17 generics
Swift 0x17 generics
 
Haskell study 8
Haskell study 8Haskell study 8
Haskell study 8
 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
 
Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815Python_numpy_pandas_matplotlib 이해하기_20160815
Python_numpy_pandas_matplotlib 이해하기_20160815
 
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
 
Python+numpy pandas 3편
Python+numpy pandas 3편Python+numpy pandas 3편
Python+numpy pandas 3편
 
Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1Start IoT with JavaScript - 4.객체1
Start IoT with JavaScript - 4.객체1
 

Semelhante a [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용

HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
suitzero
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
Kimjeongmoo
 

Semelhante a [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 (20)

5. queue
5. queue5. queue
5. queue
 
강의자료5
강의자료5강의자료5
강의자료5
 
강의자료4
강의자료4강의자료4
강의자료4
 
강의자료3
강의자료3강의자료3
강의자료3
 
R 기본-데이타형 소개
R 기본-데이타형 소개R 기본-데이타형 소개
R 기본-데이타형 소개
 
4. stack
4. stack4. stack
4. stack
 
02. data structure and stl
02. data structure and stl02. data structure and stl
02. data structure and stl
 
Data structure review (summer study)
Data structure review (summer study)Data structure review (summer study)
Data structure review (summer study)
 
개경프 1주차 Stl study
개경프 1주차 Stl study개경프 1주차 Stl study
개경프 1주차 Stl study
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
[SOPT] 데이터 구조 및 알고리즘 스터디 - #03 : 정렬 (기본, 효율, 초효율
 
[Swift] Data Structure - Queue
[Swift] Data Structure - Queue[Swift] Data Structure - Queue
[Swift] Data Structure - Queue
 
C++ Advanced 강의 4주차
 C++ Advanced 강의 4주차 C++ Advanced 강의 4주차
C++ Advanced 강의 4주차
 
STL.doc
STL.docSTL.doc
STL.doc
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
 
자료구조02
자료구조02자료구조02
자료구조02
 
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
[SOPT] 데이터 구조 및 알고리즘 스터디 - #02 : 스택, 큐, 수식 연산
 
[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue
 
데이터 분석 3 - Java Collection Framework와 ArrayList
데이터 분석 3 - Java Collection Framework와 ArrayList데이터 분석 3 - Java Collection Framework와 ArrayList
데이터 분석 3 - Java Collection Framework와 ArrayList
 
파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기파이썬 Collections 모듈 이해하기
파이썬 Collections 모듈 이해하기
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 

Mais de Sehyeon Nam

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
Sehyeon Nam
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11
Sehyeon Nam
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
Sehyeon Nam
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmary
Sehyeon Nam
 
D2 ppt
D2 pptD2 ppt
D2 ppt
Sehyeon Nam
 

Mais de Sehyeon Nam (15)

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11
 
Game programing gems 1.11
Game programing gems 1.11Game programing gems 1.11
Game programing gems 1.11
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong Yu
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
 
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
 
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmary
 
D2 ppt
D2 pptD2 ppt
D2 ppt
 

[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용

  • 1. 1부 프로그래밍 기법들 1.4 게임 프로그래밍에서의 STL 활용 (James Boer) Page 83 ~ 100 NHN NEXT, NEXON 라태웅
  • 2. STL(Standard Template Library)이 공식적으로 생겨난 때는 1997년 STL은 컨테이너(데이터의 모음) 클래스들의 모음 deque list queue map multimap set multiset bitset 등이 존재함 priority_qu eue stack vector 컨테이너는 시퀀스 컨테이너와 결합 컨테이너로 나뉨 시퀀스 컨테이너 원소들이 직선 순서대로 배치 결합(연관) 컨테이너 레드 블랙 트리, 균형 이진 트리 형태특정 위치에 대한 삽입이 허용되지 않음
  • 3. 반복자 컨테이너 안의 요소들에 대한 포인터와 비슷한 개념 ++ 연산자로 반복자를 컨테이너 안의 다음 요소로 옮기는 것 * 연산자로 반복자를 역참조해서 실제 데이터를 얻어오는 것 알고리즘 STL 클래스들에 대해 작동하는 알고리즘, 독립적인 함수로 존재 데이터와 알고리즘을 분리시키기 위해 컨테이너에 포함되지 않음
  • 4. 주요 개념 컨테이너의 시작 begin() 컨테이너의 끝 end() 주의! end()는 마지막 요소가 아니라 마지막 요소 다음의 유효하지 않은 위치를 가리킴 STL 컨테이너들은 정보를 참조(by ref)가 아닌 값(by val)으로 전달 크기가 큰 구조체나 클래스라면 포인터를 넘겨주도록 하는 것이 바람직 그렇지 않으면 매 번의 삽입, 접근마다 객체의 복사를 위해 생성자가 호출된다. begin() … … … … end() data data data data data none
  • 5. 벡터 동적으로 크기를 변경할 수 있는 배열 주기적으로 메모리를 재할당하고 새 배열로 데이터를 전송할 수 있는 배열 “크기가 변할 수 있는 배열”이라 함은, 필요한 양 이상의 메모리를 할당할 수 있음 벡터의 끝에 하나의 요소를 추가하는 작업은 “상각된“ 상수적 시간 공간이 꽉 찬 경우, 새 메모리를 할당하고, 기존 메모리에 있는 배열을 새 메모리로 복사하고, 기존 메모리를 해제하는 추가적인 시간과 자원이 소모 메모리를 재할당하면 반복자들이 무효화 새로운 메모리를 할당하고 기존 메모리를 해제하기 때문 메모리 재할당이 언제 일어나는지 이해해야 함
  • 6.
  • 7.
  • 8. c.reverse(10) none none none none none none none none none none
  • 9. c.push_back(3) c.begin() 3 c.end() none none none none none none none none none
  • 10. c.push_back(99) c.begin() 3 99 c.end() none none none none none none none none
  • 11. c.push_back(99) c.begin() 3 99 43 c.end() none none none none none none none
  • 12. c[0] = 12 c.begin() 12 99 43 c.end() none none none none none none none
  • 13. c[1] = 32 c.begin() 12 32 43 c.end() none none none none none none none
  • 14. c[2] = 999 c.begin() 12 32 999 c.end() none none none none none none none
  • 15. 리스트 이중 연결 리스트(Double Linked List)로 구현됨 어떠한 요소 삽입이나 삭제도 상수적인 시간으로 수행됨 연결 리스트이기 때문에 벡터나 데크처럼 특정 요소에 임의 접근은 불가능 벡터와 정확히 동일한 방식으로 사용 가능 push_front(), push_back 등
  • 16.
  • 17.
  • 18. 데크 컨테이너의 양 끝에서 요소의 삽입과 제거가 일어남 컨테이너 중간에서는 요소의 삽입이나 제거가 잦지 않을 때 사용 벡터와 마찬가지로 양 끝에서 삽입과 삭제는 상각된 상수적 시간이 걸린다 큐 자체 내부 데이터의 본성 때문에 임의 접근이 가능하지만 벡터보다 비효율적 시작점이 제일 처음 위치가 아니거나, 등등 none data none 양 끝에서 삽입과 삭제가 일어날 수 있기 때문에 위와 같은 상태일 수 있음 벡터와 달리 추가적인 메모리 할당을 결정할 수 없음
  • 19.
  • 20.
  • 21.
  • 22. 맵 Key-Value 쌍을 담는 컨테이너 해시 테이블보다는 비효율적이지만 속도의 차이는 무시할 수 있을 정도 삽입과 함께 정렬이 수행 즉, map의 데이터는 항상 정렬된 상태로 존재 Key를 통해 값을 조회하는 데 걸리는 시간은 O(log n) 균형 이진 트리 형태(혹은 레드 블랙 트리)의 구조 때문에 O(log n)의 시간이 걸린다
  • 23.
  • 24.
  • 25.
  • 26. 스택 push(), pop(), top()의 기본적인 멤버 함수를 제공 size()와 empty()로 현재 상태를 알 수 있다 스택은 기본적으로 하나의 deque로 구현 stack<int> c; // deque stack stack<int, vector<int>> c; // vector stack push_back, pop_back, back() 함수를 제공하는 어떠한 컨테이너라도 vector대신 사용 가능 pop()이나 top()을 수행할 때 항상 검사해야 함 안전성보다는 속도를 우선으로 설계 pop()과 top()을 할 때 스택에 요소가 있는지 size()나 empty()로 미리 점검해 주어야 함 큐와 우선 순위 큐도 마찬가지
  • 27. 큐 push(), pop(), front(), back()의 기본적인 멤버 함수를 제공 size()와 empty()로 현재 상태를 알 수 있다 back()이 요소가 삽입될 위치이다 큐 또한 기본적으로 deque를 사용하나 변경 가능 vector는 앞쪽에서 요소를 추가하거나 제거하면 나머지 요소들이 모두 밀리거나 당겨짐 때문에 vector는 비효율적 우선 순위 큐 큐와 동일하나 삽입과 동시에 내림차순으로 정렬 < 연산자를 기반으로 정렬 때문에 세번째 인자로 사용자 정의 비교 함수를 넣을 수 있음 포인터를 넣었을 경우 주소값을 비교하기 때문에 필수적
  • 28. 결론 STL의 장단점을 잘 이해하면 코드의 속도나 무결성을 훼손하지 않고 강력한 기 능을 최대한 활용할 수 있다 STL은 그 자체만으로 책 한 권을 쓸 수 있는 방대한 주제 이 글을 통해서 STL의 가능성과 매력만을 맛볼 수 있기를 바람
  • 29. 참고 자료 The C++ Standard Library: A Tutorial and Reference The C++ Programming Language Designing Components with the C++