스택 스택은 LIFO를 따른다. 즉 Last In First Out 후입 선출을 따른다. 먼저 들어온 데이터가 나중에 나가는 구조의 자료구조이다. 게임에서 자주 사용하는 기능중 하나인 되돌기기 기능을 구현할 때 스택을 사용한다. #include #include using namespace std; int main() { stack s; s.push(1); s.push(2); s.push(3); // 비었나?? while (s.empty() == false) { int data = s.top(); // 최상위 원소 삭제 s.pop(); cout
분류 전체보기
선형 자료구조 선형 구조는 자료를 순차적으로 나열한 형태이다. 배열이나 연결리스트, 스택, 큐 등을 말한다. 비 선형 구조는 하나의 자료 뒤에 다수의 자료가 올 수 있는 형태를 의미한다. 트리나 그래프 등이 있다. 선형 구조는 어떤 언어에서든 구현되어 있다. 배열 배열은 사용할 방 개수를 고정해서 계약하고 절대 변경이 불가능하다. 연속된 방을 배정 받아 사용한다. 장점은 연속된방이라는 점이고 단점은 방을 추가하거나 축소가 불가능하다는 점이다. 호텔에서 우리가 친구 3명이서 체크인 할 때 101호 , 102호, 103호를 배정 받았지만 친구 한명이 갑자기 급한일로 읺 ㅐ집에 가면 103호를 환불 받을 수 없는 것과 동일하다. 동적 배열 동적 배열은 사용할 방 개수를 유동적으로 계약하는 것이다. 이 역시 연..
C++ 알고리즘을 다루기 위해 미로게임을 통해 차근차근 하나씩 쌓아 올릴 예정이다. 가령 미로를 탈출하는 알고리즘을 처음에는 오른손 법칙부터 그걸 개선하고 길 찾기 알고리즘으로 수정하는 식으로 말이다. 환경 설정 Visual Studio 2022으로 진행한다. 콘솔앱으로 진행할 것이기 때문에 어떤 버전으로 해도 상관은 없다. 일반 algorithm을 공부할 때는 algorithm 프로젝트에, maze는 maze 프로젝트에서 관리를 하겠다. 그리고 ConsoleHelper 클래스를 하나 만들겠다. 이는 콘솔에 출력하는 것을 도와주는 클래스 이다. Maze의 속성에 들어가 미리 선언된 컴파일러 헤더를 '사용'으로 바꿔주고 헤더 파일은 pch.h로 설정한다. pch 클래스를 만들고 pch.cpp 속성을 들어거..
람다(lambda) 람다 표현식. 정말 유용하게 사용할 수 있는 문법이다. 오른쪽 참조는 새로 추가된 문법으로 C++의 속도를 향상 시킬 수 있는 문법인것에 반면 람다는 굳이 사용하지 않더라도 지금까지 배운 내용으로도 대신할 수 있는 문법이다. 람다를 다르게 말하면 함수 객체를 빠르게 만드는 문법이다. #include #include #include using namespace std; enum class ItemType { None, Armor, Weapon, Jewelry, Consumable, }; enum class Rarity { Common, Rare, Unique, }; class Item { public: Item(){} Item(int itemId, Rarity rarity, ItemTy..
오른값 참조(rvalue reference) c++11에서 가장 유의미한 변화를 준 것은 오른값 참조이다. 코드의 속도가 달라질 정도로 많이 변화가 되었다. lvalue는 단일식을 넘어서 계속 지속되는 개체를 의미하고 rvalue는 lvalue가 아닌 나머지를 의미한다.(임시 값, 열거형, 람다, i++ 등) #include using namespace std; class Knight { public: public: int _hp = 100; }; // 불필요한 복사가 일어남, 원본 객체 수정 불가 void TestKnight_Copy(Knight knight) { // TODO } // 불필요한 복사가 일어나지 않음. 원본 객체 수정 가능 void TestKnight_LValueRef(Knight& k..
using c++11에서 typedef를 대신해서 사용할 수 있는 문법으로 using을 추가한 것이 결론이다. using을 typedef에 대신해서 사용하는 이유를 알아보자. typedef int id; using id2 = int; // 1) 직관성 // 함수 포인터 typedef void(*MyFunc)(); using MyFunc = void(*)(); // 2) 템플릿 template typedef vector vec; // 에러 템플릿이랑 같이 사용 불가 template using Vector = vector; // 템플릿 지원 enum class scoped enum이라고도 불린다. enum class는 이름 공간을 관리할 수 있다는 장점이 있다. enum PlayerType { Knight,..
이번 포스팅부터는 C++11에 추가된 여러 문법들에 대해 공부해 보겠다. 더보기 C++11 부터 Modern C++이라고 한다. 그 만큼 많은 변화가 있었다. 꼭 알아두어야 한다. auto auto 키워드는 우리가 변수를 선언할 때, 지정해준 자료형 대신 사용할 수 있다. 자동으로 컴파일러가 자료형을 추론해서 자료형을 지정해 주는것이다. #include using namespace std; class A { }; int main() { int a = 3; float b = 3.2f; A c = A(); const char* e = "asd"; // 컴파일러가 오른쪽 값을 보고 자동으로 추론 auto a = 3; auto b = 3.2f; auto c = A(); auto e = "asd"; return ..
지금까지 포스팅한 vector와 list는 시퀀스 컨테이너, 데이터가 삽입하는 순서대로 나열되는 형태를 가졌다. 그 중 나머지 하나인 deque에 대해 알아보자. deque double-ended queue를 말한다. 실제로 많이 사용하는 경우는 크게 없다. 간단한 원리만 알아보도록 하자. vector와 list를 합쳐놓은 STL이라고 생각할 수 있다. 동적 배열로 배열이 생성되고 그 영역을 넘어가게되면 새로운 영역을 만들어서 데이터를 추가한다. 그리고 이전 영역에서 새로운 영역을 가리켜서 동작한다. #include #include #include using namespace std; int main() { deque dq; dq.push_back(1); dq.push_front(2); cout
vector랑 양대산맥중 하나. vector와 list는 매우 유사해서 list를 자주 사용하기보다는 다른 자료구조를 이해하는 발판으로써 포스팅을 한다. List 동작 원리 vector는 동적 배열로 이루어진 컨테이너였다. 연속적인 메모리를 할당받아 증설하는 형식이었다. list는 이중 연결리스트이다. 즉, 데이터가 저장된 메모리가 연속적인 메모리가 아니라는 것이다. 다음 노드가 어디에 있는지를 각자 저장한 형태이다. 노드의 포인터로 서로를 가리키고 있는 것이다. vector에서 데이터를 중간에 추가하고자 하면 데이터가 연속적으로 존재해야하기 때문에 결국 값을 전부 복사해야한다. 하지만 list의 경우 중간에 낄 노드 양 옆에 포인터를 조작하면 바로 가능하다. 이는 데이터가 연속적으로 존재하지 않기 때문..
정말정말 중요한 내용이다. STL은 Standard Template Libaray이다. 프로그래밍 할 때 필요한 자료구조/ 알고리즘들을 템플릿으로 제공하는 라이브러리이다. STL에 대해 공부하기 전에 여러 용어에 대해 알아야한다. 컨테이너(container) 우리가 이전에 여러 데이터를 저장하는 방법으로 배열 방식이외의 방식은 없었다. 컨테이너는 데이터를 저장하는 객체 즉 자료구조 Data Structure인 것이다. 이 컨테이너중 하나인 Vector에 대해 다뤄보겠다. Vector 벡터의 원리에 대해 정확히 알고 있어야한다. 1. vector의 동작 원리 (size/capacity) 2. 중간 삽입/삭제 3. 처음/끝 삽입/ 삭제 4. 임의 접근 vector를 알기 전 그전에 사용했던 배열에 대해 생각..