Game Programming/게임 프로그래밍 C++ 10

[C++] 람다 식

[C++] 람다(lamda) 식 람다(lamda)식 C++ 11에서 부터 추가된 식이며, 람다 식은 함수에 인수로 호출되거나 전달되는 위치에서 익명 함수 개체(클로저)를 정의하는 편리한 방법이다. 일반적으로 알고리즘 또는 비동기 함수에 전달되는 몇 줄의 코드를 캡슐화하는 데 사용된다. 1. []는 capture절로 변수 또는 함수를 가져올 수 있다. 람다 소개자 2. ()는 매개 변수를 넣는 부분. 선택적이다. 3. mutable는 변경이 가능한 사양을 넣는 부분. 선택적 4. throw()는 예외처리. 선택적 5. ->type 리턴 타입 설정. 선택적 6. {}는 람다의 본문이다. #include #include using namespace std; //일반 함수 void Sum(int a, int b..

[C++] 해시 (Hash)

[C++] 해시 (Hash) 해시 (Hash) 해시는 해시함수의 결과물이며, 저장소에서 값과 매칭되어 저장되며 해시테이블의 구성 요소이다. ▹ 이진 트리가 아닌 해시 테이블로 구성되어있다. ▹ 올바른 키와 올바른 해시 테이블 크기가 만족된다면 요소를 검색하는 속도는 O(N)에서 O(1)로 단축할 수 있다. 해시 테이블 (Hash Table) 해시 테이블은 연관 컨테이너 구조를 이용하여 키(key)에 값(Value)을 저장하는 자료 구조이다. 키, 해시 함수(Hash Function), 해시, 값, 저장소(Bucket)로 이루어져 있으며 키는 해시함수를 통해 해시로 변경되며 해시는 값과 매칭되어 저장소에 저장이 된다. 해시 함수 (Hash Function) 키(key)를 해시(Hash)로 바꿔주는 역할을 ..

[C++] 연관 컨테이너, 집합과 맵

[C++] 연관 컨테이너, 집합과 맵 연관 컨테이너 (Associative Container) 삽입/제거된 요소의 순서를 유지는 하는 순차컨테이너의 특성을 무시하고 요소를 검색하는 과정을 최대한 빠르게 수행하는데 초점을 맞춘 컨테이너이다. 속간 복잡도는 O(logN) or O(1)를 가진며 set, map, hash등이 있다. 집합 (Set) #include //... set //key : 요소의 타입, compare : 삽입하는 요소를 비교하는 함수 // set s; 수학의 집합의 성질을 가지고 있는 컨테이너로 개체들이 집합에 포함되거나 포함되지 않는 두가지 형태를 가진다. ▹ 같은 개체의 인스턴스를 한개만 보관가능. 즉, 중복을 없앤다. ▹ 요소들이 추가된 순서가 아닌 특정한 순서(compare : ..

[C++] 데큐와 리스트

[C++] 데큐와 리스트 순차 컨테이너와 그 컨테이너의 속한 벡터를 알아보았었다. 이번에는 순차 컨테이너에 속하는 데큐와 리스트를 알아볼 것이다. 벡터와 비교해서 어느부분이 차이가 있고 어떠한 이점을 가지고 있는지 살펴보자! 데큐 (Deque, Double Ended Queue) #include //... deque dq; 모든 면에서 벡터와 유사하지만 작업 위치에 따른 실행 비용에서 차이가 있다. 벡터처럼 모든 요소들을 큰 메모리 블럭에 저장하지만 요소들을 여러개의 메모리블로으로 이용한다. ▹ 마지막에 추가/제거하는 작업의 속도는 빠른 속도(O(1))이지만 중간에 요소를 추가/제거하는 속도는 비교적 느린속도(O(N))이다. ▹ 큐와 같이 FIFO(First In First Out)의 데이터 구조를 구현..

[C++] 순차 컨테이너와 벡터

[C++] 순차 컨테이너와 벡터 순차 컨테이너 (Sequence Container) 요소들의 보관 순서를 유지할 수 있도록 해주며 어떤 위치든 삽입, 제거가 가능하지만 성능에 있어서는 각각 다른 특성들을 가진다. 종류는 벡터, 데큐, 리스트 등이 있다. 벡터 (Vector) #include //... Vector vName; //Ex vector vInt; int a = 5; vInt.push_back(a); ▹ 원하는 위치에 추가/제거 가능하다. ▹ 양방향 반복자를 제공한다. 전/후진으로 요소에 접근 가능하다. ▹ C의 배열과 기능은 비슷하지만 미리 할당할 필요가 없으며, 추가할 수 있는 요소에 제한적이지 않다. ▹ 모든 요소를 하나의 큰 블럭에 보관한다. 생성자와 반복자 //생성자 vector v; ..

[C++] STL

[C++] STL STL (Standard Template Library) 여러가지 다른 구조를 보관하기 위한 컨테이너와 컨테이너 내의 요소를 접근하기 위한 반복자, 그리고 컨테이너에 특정한 작업을 위한 알고리즘 클래스로 구성되어 있다. 컨테이너 순차 컨테이너와 연관 컨테이너로 구성되어 있으며, 여러가지 구조 데이터를 보관하는 객체이다. - 순차 컨테이너 : 요소들을 보관된 순서를 유지할 수 있게 해주며, 어떤 위치든 삽입, 제거가 가능하지만 성능에 있어서는 다른 특성을 가진다. / 벡터, 데큐, 리스트 등 - 연관 컨테이너 : 정렬 연관 컨테이너와 해쉬 연관 컨테이너 두 분류로 존재한다. 특정 요소에 대한 빠른 검색을 제공하며 사용자가 지정한 순서가 아닌 자신의 규칙에 따른 순서로 보관한다. / 세트,..

[C++] 메모리 할당

[C++] 메모리 할당 C++ 프로그램들은 실행하는 동안 변수처럼 새로운 개체를 만들 때 메모리를 할당해야한다. 그리고 메모리 구조는 크게 데이터, 코드, 힙, 스택 영역으로 분류하며 각각의 역할이 정해져있다. 메모리 할당을 정리하기에 앞서 메모리 구조에 대해 알아볼 필요가 있다. 스택과 힙에 대해서 먼저 알아보겠다. 스택 (Stack) 함수에 전달되는 인자(매개변수), 함수내에 저장되는 지역 변수 등이 저장되는 곳이다. ▸ 한정된 범위 내에서 임시적으로 사용될 때 좋다. ▸ LIFO(Last In First Out)구조를 가지며, 가장 나중에 들어온 것이 먼저 나가는 구조이다. ▸ 제한된 크기를 가지고 있어 용량을 초과하는 개체를 넣으면 스택오버플로우 현상이 발생한다. 힙 (Heap) 사용자가 직접 관..

[C++] 형변환과 템플릿

[C++] 형변환과 템플릿 형변환 데이터를 다른 데이터 형으로 바꾸는 과정이다. int num = 250; float fNum1 = num/100; //fNum1 == 2.0f float fNum2 = (float)num/100; //fNum2 = 2.5f 명시적 형변환 float fNum3 = num; //묵시적 형변환. 컴파일러가 형을 변환해준다. 형변환을 해야하는 경우 1. 다른 코드 섹션의 인터페이스가 특정한 형을 요구할 때 2. 개체의 다형적 이용 C++ 스타일 형변환 ▷ static_cast 정적 형변환, 컴파일 타임에 형변환이 가능한지 검사한다. class A {}; class B : public A {}; class C {}; A* a = new A(); B* b = static_cast(..

[C++] 포인터,상수, 참조

[C++] 포인터, 상수, 참조 포인터 (Pointer) 개체의 메모리 주소를 저장하는 변수이다. 힙에 새 개체를 할당할 때, 함수를 다른 함수에 전달할 때, 배열 또는 기타 데이터 구조의 요소를 반복할 때 주로 사용한다. int *a; //C스타일 int* a; //C++스타일 int a = 3; //a는 3이고 주소값 x를 갖는다. int* b; //b는 포인터이다. b = &a; //b는 a의 주소값을 가리킨다. 즉, b는 x이며, *b == a 이다. *b += 1; //*b == a 와 같기때문에 a += 1 즉, a = 4; 포인터는 형식화된 개체 또는 void를 가리킬 수 있는데, 프로그램이 메모리의 힙에 개체를 할당하면 포인터 형태로 해당 개체의 주소를 받고 이것을 소유 포인터라고 한다. ..

[C++] 클래스와 상속

[C++] 클래스와 상속 클래스 (Class) struct Vector3D { float x; float y; float z; }; class Vector3D { public: float x; float y; float z; }; 데이터와 함수를 연결하는 하나의 방법으로 클래스의 특정 인스턴스를 개체라고하며, 개체는 자신만의 데이터를 포함하지만 동일 클래스의 모든 개체는 같은 함수를 공유한다. 구조체(struct)의 상위 버전이다. 구조체와는 달리 접근 제어의 차이가 있는데, 클래스는 public, protected, private이라는 세가지 접근 단계를 제공한다 (OOP의 캡슐성). 구조체는 기본적으로 public이며 클래스는 기본적으로 private이다. 클래스 선언 시 자동적으로 선언되는 암시적 ..