본문 바로가기

전체 글539

[STL] vector #4 vector 직접 만들기 template class Vector { public: Vector() : _cata(nullptr), _size(0), _capacity(0) { } ~Vector() { if (_data) delete[] _data; } T& operator[](const int pos) { return _data[pos]; } public: void push_back(const T& val) { if (_size == _capacity) { // 증설 작업 int newCapacity = static_cast(_capacity * 1.5); // capacity가 0 or 1 이면 0과 1.5 짤려서 1을 반환하기 때문에 체크 if (newCapacity == _capacity) newC.. 2023. 5. 15.
[STL] vector #3 vector = 동적 배열 = 동적으로 커지는 배열 = 배열 원소가 하나의 메모리 블록에 연속하게 저장된다. 중간 삽입/삭제 (BAD) vector의 중간 삽입은 새로운 데이터를 중간에 하나만 딱 밀어넣는게 아니라, 기존에 있던 데이터를 모두 이동시키는 것이기 때문에 비효율적이다. 데이터 크기가 클수록 더욱 비효율적이다. 또한 vector는 연속된 메모리 블록이기 때문에, 원소를 중간 삭제했을 때 데이터를 날리고 끝나는 게 아니라 나머지 데이터도 이동해야 돼서 비효율적이다. [0] [1] [2] [3] [4] [0] [1] [5] [2] [3] [4] 결론은 vector의 중간 삽입/삭제는 비효율적이다. 처음/끝, 삽입/삭제 (처음 - BAD / 끝 - GOOD) 처음 삽입/삭제는 뒤에 있는 데이터가 이.. 2023. 5. 15.
[STL] vector #2 반복자(iterator) : pointer와 유사한 개념. 컨테이너의 원소(데이터)를 가리키고, 다음/이전 원소로 이동 가능 vector v(10); for (vector::size_type i = 0; i < v.size(); i++) v[i] = i; vector::iterator it; iterator도 class다. 위 설명 코드 ex) class MyIterator { }; class MyVector { public: typedef MyIterator iterator; typedef unsigned int size_type; } pointer와 비교해서 설명한 ex) iterator는 pointer처럼 활용할 수 있다. vector v(10); for (vector::size_type i = 0.. 2023. 5. 15.
[STL] vector #1 STL (Standard Template Library) 프로그래밍 할 때, 필요한 자료구조/알고리즘들을 템플릿으로 제공하는 라이브러리 컨테이너(Container) : 데이터를 저장하는 객체 (자료구조 Data Structure) vector (동적 배열) vector의 동작 원리 (size/capacity) 중간 삽입/삭제 처음/끝, 삽입/삭제 임의 접근 배열 const int MAX_SIZE = 10 int arr[MAX_SIZE] = { }; for (int i = 0; i < MAX_SIZE; ++i) arr[i] = i; 근데 여기서 추가로 데이터를 가지고 싶다면? 몬스터를 추가시키고 싶다면? 그러면 애초에 배열의 크기 10으로 잡아서 사용못하는 문제가 있을 것이다. 추가적으로 배열을 늘리는 것.. 2023. 5. 15.
[C++] Chapter 10. 콜백 함수 (Callback) 콜백함수 함수 포인터 + 함수 객체 + 템플릿 콜백 (Callback) : 다시 호출하다? 역으로 호출하다? 게임을 만들 때, 이런 콜백의 개념이 자주 등장한다. ex) MoveTask 실습 등 어떤 상황이 일어나면 → 이 기능을 호출해줘 ex) UI 스킬 버튼을 누르면 → 스킬을 쓰는 함수를 호출 (함수 포인터 or 함수 객체 등 으로 넘겨줌) 함수 포인터는 사용 안했고, 함수 객체와 템플릿을 사용한 예 class Item { public: int _itemId = 0; int _rarity = 0; int _ownerId = 0; } class FindByOwnerId { public: // 함수 객체를 사용하기 위한 연산자 오버로딩 bool operator()(const Item* item) { r.. 2023. 5. 15.
[Programmers] (스택/큐) Lv 2. 올바른 괄호 https://school.programmers.co.kr/learn/courses/30/lessons/12909?language=cpp 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr #include #include using namespace std; bool solution(string s) { int res[2] = {}; for (const auto& el : s) { ++res[(el == '(') ? 0 : 1]; if (res[0] < res[1]) return false; } return res[0] == res[1]; } GitHub : .. 2023. 5. 15.
[C++] Chapter 09. 템플릿(Template) #2 템플릿 : 함수나 클래스를 찍어내는 툴 함수 템플릿 클래스 템플릿 클래스 템플릿 사용 전 class RandomBox { public: int GetRandomData() { int idx = rand() % 10; return _data[idx]; } public: int _data[10] } int main() { srand(time(nullptr)); RandomBox rb1; for (int i = 0; i < 10; ++i) { rb1.data[i] = i; } int value1 = rb1.GetRandomData(); cout 2023. 5. 12.
[C++] Chapter 08. 템플릿(Template) #1 템플릿 : 함수나 클래스를 찍어내는 툴 함수 템플릿 클래스 템플릿 함수 템플릿 사용 전 void Print(int a) { cout 2023. 5. 12.
[C++] Chapter 07. 함수 객체 함수 객체 (Functor) : 함수처럼 동작하는 객체 함수 포인터의 단점 완전히 동일한 시그니처로 만들어진 함수만 들고있을 수 있지만, 함수 객체를 사용하면 어느 정도 극복 가능 시그니처가 안 맞으면 사용할 수 없다. 상태를 가질 수 없다. (멤버를 가질 수 없어서 경우에 따라서 기존에 실행했던 또는 저장했던 데이터를 유지시키고 싶지만 그럴 수 없다.) [함수처럼 동작]하는 객체 그래서 () 연산자 오버로딩이 필요하다 class Functor { public: void operator()() { cout 2023. 5. 12.
[C++] Chapter 06. 함수 포인터 포인터라는 건 주소를 담는 바구니. int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int main() { int a = 10; typedef int DATA; // 1) 포인터 * // 2) 변수이름 pointer // 3) 데이터 타입 int DATA* pointer = &a; // 함수 (고전적인 방식) typedef int(FUNC_TYPE)(int, int); // mordern C++ using FUNC_TYPE = int(int a, int b); // 1) 포인터 * // 2) 변수이름 fn // 3) 데이터 타입 함수 (인자는 int, int. 반환은 int) FUNC_TYPE* fn; // 함.. 2023. 5. 12.