분류 전체보기 131

#59. set & multimap & multiset

*컨테이너에서 쓰이는 기본적인 데이터 조작 방식. 1.삽입 2.삭제 3.검색 4.순회 *Set ( Key = Value ) => 키와 값이 똑같은 데이터로 담는 컨테이너 => 결국, Key = Value 것만 빼면 map 과 동일 *multimap => 동일한 Key 에 대한 '중복된 데이터' 를 넣어줄 수 있음. => m[5] = 500 => 문법 막혀있음. => 유일하지않은 데이터. => erase(1); => Key = 1 인 데이터 모두 삭제. multimap::iterator FindIt = mm.find(1); auto itPair = mm.equal_range(1); auto FindBegin = mm.lower_bound(1); auto FindEnd = mm.upper_bound(1); ..

프로그래밍/C++ 2022.07.21

#58. Map

*연관 컨테이너 ( associate Container ) => 키 ( Key ) 와 값 ( Value ) 를 묶어서 데이터를 하나의 쌍으로 저장하는 컨테이너 *Map *왜 Map 이 필요한가 ?? => vector, list 만으론 데이터를 찾기 부족하다. ( 10만명 유저 접속, 5만명 퇴장되어진 상황 ) ID = 2만 플레이어 가 ID = 1만 플레이어 를 공격하고 싶다. Q) ID = 1만인 Player 를 찾아라!! 어떻게 ?? => vector, list 등 선형 자료구조를 이용해선 빠르게 찾을 수 없다. 한땀한땀 찾아야함. 결국, 원하는 조건에 해당하는 데이터를 빠르게 찾을 수 없다. *균형 이진 트리 ( AVL ) 로 구현되어져 있다. => 이진 탐색 트리의 최악의 상황 ( 데이터를 추가했..

프로그래밍/C++ 2022.07.21

#57. deque

*deque ( double-ended quee ) => 벡터처럼 데이터를 저장하지만 메모리 초과 시, 메모리를 재할당하는 것이 아니라, 리스트처럼 해당 크기만큼을 할당받고 연결한다. => vector, list 의 짬뽕 => vector 와 마찬가지로 배열 기반으로 동작 다만, 메모리 할당 정책이 다름. deque dq; dq.push_back(1); dq.push_back(2); dq.push_front(3); cout 중간에 삭제하면 나머지 부분들을 당겨서 맞춰야함. => 데이터가 연속적이어야함을 보장해야함. *처음 / 끝 삽입 / 삭제 => 둘 다 빠름. *메모리 부족 시, 일정 크기의 메모리를 할당. => 벡터처럼 더 큰 메모리를 재할당하고 기존 값을 복사하지 않음. *GetBlock ( ) /..

프로그래밍/C++ 2022.07.21

#56. list

*List => 선형 자료구조 => 삽입 / 삭제 용이 => 해당 위치의 iterator 를 알고 있을 때. *Node 기반 *이중 연결 리스트 ( 양방향 ) li.insert(li.begin(), 100); li.erase(li.begin()); li.pop_front(); li.pop_back(); li.remove(5); => 해당 인자를 모두 삭제. *임의접근 연산자들은 다 막혀있음. => 특정 데이터에 접근하려면 순차적 탐색 필요. *list 는 sort 함수가 따로 존재한다. li.sort ( ) why ?? => std::sort 함수의 매개변수의 반복자는 반드시 RandomAccess Iterator ( 임의접근 ) 이어야 함. 리스트의 반복자는 Bidirectional Iterator (..

프로그래밍/C++ 2022.07.21

#55. vector

*STL ( Standard Template Library ) *시퀀스 컨테이너 ( Sequence Container ) ( 선형 자료구조 ) => 데이터가 삽입 순서대로 나열되는 형태 => vector, list, deque... *vector *임의 접근 용이. => operator [ ] *중간 삽입 / 삭제 => 굉장히 비효율적 => vector 는 '연속적' 이어야 하는 보장이 있어야 하기 때문. *처음 / 끝 -> 삽입 & 삭제 => 처음 위치에 삽입 / 삭제 : 중간 삽입과 마찬가지로 비효율적. => 끝 위치에 삽입 / 삭제 : 효율적 *배열의 단점 => 고정크기, 유동적이지 못함. *동적 배열 1. '여유분' 의 메모리를 할당. 2. 여유분까지 꽉 찼으면 메모리 증설. *여유분 개념 ( c..

프로그래밍/C++ 2022.07.21

#54. 콜백함수

*콜백 ( Callback ) : 다시 호출하다 ?? 역으로 호출하다 ?? => 어떤 상황이 일어나면 -> 이 기능을 호출해줘. ex) UI 스킬 버튼을 누르면 -> 스킬을 쓰는 함수를 호출 class Item { public: int _ownerId = 0; int _itemId = 0; int _rarity = 0; }; class FindByOwner { public: bool operator()(const Item* item) { cout _rarity = i + 1; } FindByOwner byOwner; byOwner._ownerId = 2; FindByRarity byRarity; byRarity._rarity = 9; Item* Ret = FindItem(Items, 10, &byOwne..

프로그래밍/C++ 2022.07.20

#53. 클래스 템플릿

* 클래스 템플릿 template class RandomBox { public: T GetRandomData() { int idx = rand() % 10; return _data[idx]; } public: T _data[10]; }; *무조건 typename 을 붙여야 하는 것은 아니다. template class RandomBox { public: T GetRandomData() { int idx = rand() % SIZE; return _data[idx]; } public: T _data[SIZE]; }; RandomBox rb1; RandomBox rb2; rb1 = rb2 => ( X ) => rb1 / rb2 는 각각 독립적인 객체이다. *100% 일치해야지만 가능. RandomBox rb..

프로그래밍/C++ 2022.07.20

#52. 함수 템플릿

* 템플릿 : 함수나 클래스를 찍어내는 툴 1. 함수 템플릿 2. 클래스 템플릿 *함수 템플릿 void Print(int a) { cout 로 타입을 지정 가능. template T Add(T A, T B) { return A + B; } template T3 Add(T1 A, T2 B) { return A + B; } => int result = Add(10.5, 1.0f); int result = Add(10.5, 1.0f); => ( ERROR ) => 타입 지정해줘야함. *템플릿 특수화 => 특정 매개변수를 별도로 처리하고 싶을 때 사용. template void Print(T a) { cout

프로그래밍/C++ 2022.07.20

#51. 함수 객체

*using & typedef 을 이용한 함수포인터 사용 단점 void (*PF)(void); PF = &HelloWorld; 1. 시그니처가 안 맞으면 사용할 수 없다. 2. 상태를 가질 수 없음. => ex) Knight._hp 값이 없음. *함수 객체 ( Functor ) => 함수처럼 동작하는 객체 => ( ) 연산자 오버로딩 을 이용해 동작 함수를 정의. *MMO 에서 함수 객체를 사용하는 예시 클라 서버 => 서버 : 클라가 보내준 네트워크 패킷을 받아서 처리. ex) 클라 : 나 (5, 0) 좌표로 이동 요청. => 요청사항을 객체로 만들어줌. 즉, 요청사항을 만들어주는 시점 / 그것을 실제 실행하는 시점을 분리 가능. class MoveTask { public: MoveTask(int Y,..

프로그래밍/C++ 2022.07.20