프로그래밍 74

#63. nullptr

*기존의 방식 0 NULL => #define 0 과 똑같다고 보면 됨. *왜 nullptr 이 필요했을까 ?? 1) 오동작 => 치명적일 수 있음. void Test(int a ) {} void Test(int* ptr) { } Test(0); Test(NULL); 2) 가독성 nullptr NULL *nullptr const class { public: // 그 어떤 타입의 포인터와도 치환 가능. template operator T* () const { return 0; } // 그 어떤 타입의 멤버 포인터와도 치환 가능. template operator T C::* () const { return 0; } private: //void operator&() const; // 주소값 &을 막는다. vo..

프로그래밍/C++ 2022.07.22

#62. auto

*auto auto a = 3; auto b = 3.14f; auto c = 1.23; auto d = Knight(); auto e = "test"; => 데이터 타입을 '추론' 해줌. => 형식 연역 ( type deduction ) *주의 => 기본적으로 auto 는 const , & 무시. => pointer ( * ) 는 판별 가능. int& ref = a; const int cst = a; int* iPtr = &a; auto test1 = ref; => int auto test2 = cst; => int auto test3 = iPtr; => int* *무엇이 문제일까 ?? => 어떻게 바꾸어야 할까?? auto&, int& vector v; v.push_back(1); v.push_back..

프로그래밍/C++ 2022.07.22

#61. 중괄호 초기화 { }

*중괄호 초기화 { } int a = 0; int b(0); int c{ 0 }; Knight k1; Knight k2 = k1; Knight k3{ k1 }; *어떤 '장점' 이 있는가 ?? 1. 컨테이너 초기화에 잘 어울림. vector v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); int arr[] = { 1,2,3,4 }; vector v2{ 1,2,3 }; 2. 축소 변환 방지 => 변수의 데이터 손실에 대한 에러를 발생시킴. int x = 0; double y(x); double z{ x }; '축소 변환' 은 가능한 값의 일부를 저장하지 못할 수도 있는 데이터 형식으로 값을 변경합니다. 예를 들어 소수 값은 정수 계열 형식으로 변환될 때 반..

프로그래밍/C++ 2022.07.22

#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