C++ 20

remove와 remove_if

template ForwardIterator remove(ForwardIterator first, ForwardIterator last, const T& val); template ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p ); 제목에서부터 알 수 있듯이 소개할 remove와 remove_if 함수는 특정 원소를 지워주는게 아니라, 3번째 인자 뒤에 존재하는 3번째 인자에 해당하지 않는 값으로 덮어써서 3번째 인자를 뒤로 몰아줄 뿐이다. 따라서 찾은 값을 지우고 싶다면 반드시 erase함수를 한번 더 호출해줘야 한다. 찾은 값을 뒤의 값으로 덮어 써..

공부/C || C++ 2022.09.30

static 멤버 함수가 static이 아닌 멤버 참조가 안되는 이유, static 멤버 함수에서 this를 사용할 수 없는 이유

this에 관해 몰랐거나 알아도 정확한 이유를 몰랐던 것들 1. 멤버 함수 내에 this가 묵시적으로 삽입된다 Class Go { int num; public: void SetNum(int a) { this->num = a; } }; 위와 같은 클래스가 있으면 컴파일러는 묵시적으로 Class Go { int num; public: void SetNum(Go* this, int a) { this->num = a; } } 이런식으로 this를 삽입한다 2. static 멤버 함수 내에서 this를 사용할 수 없는 이유 하지만 static 멤버 함수에 대해서는 this를 삽입하지 않아서 static 함수내에서 this를 사용할 수 없다. 왜 static 함수에 대해선 this를 삽입해주지 않는가? this는 ..

공부/C || C++ 2022.09.25

static 변수와 전역 변수와 비교

static 변수 전역 변수 메모리 생성 시점 프로그램 시작 프로그램 시작과 동시에 생성 및 초기화 메모리 소멸 시점 프로그램 종료 프로그램 종료 디폴트 초기값 0으로 자동 초기화 0으로 자동 초기화 접근 가능 범위 - 정적 지역 변수 : 중괄호 내부에서만 접근 - 정적 전역 변수 : 선언된 소스 파일 내부에서만 접근 가능 프로그램 전체에서 접근 가능 메모리 할당 공간 초기값이 있을 경우 : Data 초기값이 없을 경우 : BSS 초기값이 있을 경우 : Data 초기값이 없을 경우: BSS 초기화 횟수 딱 한번만 초기화 클래스 멤버의 경우 클래스 내부에서 초기화가 불가능해서 외부에서 해줘야 한다 Ex) ClassA::Statc_변수_이름 = 0; static 변수와 전역 변수의 초기화 시점에 관한 내용은..

공부/C || C++ 2022.09.23

C++17 string_view

c++17에 string_view라는 기능이 추가되었다. 이 기능을 사용하면 좋은 점을 예시로 살펴보자 // 원래 사용하던 방식 std::string FiveCharacterOnlyString(const std::string& str) { if (str.size() < 5) return str; return str.substr(0, 5); } // c++ 17 string_view // string_view를 사용하면 string 객체의 복사가 발생하지 않습니다. std::string_view FiveCharacterOnlyStringView(const std::string_view str) { if (str.size() < 5) return str; return str.substr(0, 5); } in..

공부/C || C++ 2022.09.19

STL Container (시퀀스 컨테이너, 연관 컨테이너, 컨테이너 어댑터)

C++ 표준 라이브러리에는 많은 종류의 라이브러리가 존재한다. 예를 들어 입출력 라이브러리(iostream 등), 시간 관련 라이브러리(chrono) 등이 있다. 특히 C++ 템플릿 라이브러리(Standard Template Library)는 다음 세 개의 라이브러리들을 의미한다 임의 타입의 객체를 보관할 수 있는 컨테이너 라이브러리(container) 컨테이너에 보관된 원소에 접근할 수 있는 반복자(iterator) 반복자들을 가지고 일련의 작업을 수행하는 알고리즘 위에서 볼 수 있듯이, 컨테이너에 임의 타입의 객체를 보관할 수 있다고 한다. 임의 타입의 객체를 보관할 수 있는 이유는 템플릿으로 구현되어 있기 때문이다. 따라서 int, string 같은 기본적인 자료형이 아닌, 사용자가 직접 만든 클래..

공부/C || C++ 2022.09.17

Windows에서의 동기화 기법

DirectX 공부를 하면서 게임을 만들고 있는데 멀티 쓰레드를 이용해서 로딩을 하기 위해 그에 대한 공부가 필요해져서 해보려고 한다. 사실 우리는 visual studio에서 이미 멀티 쓰레드 환경에서 프로그래밍을 하고 있다. Window환경에서의 쓰레드 생성을 위해 필요한 함수 // 새로운 쓰레드를 생성한다 // 1번째 인자는 자식 프로세스에 상속할때 설정해주는 구조체의 포인터 // 2번째 인자는 stack size. 0을 넘겨주면 자동으로 설정된다 // 3번째 인자는 생성한 쓰레드가 동작하게 될 함수 // 4번째인자는 생성한 쓰레드가 동작하게 될 함수에 넘겨줄 인자 // 마지막 인자에는 ThreadID를 받고 싶다면 unsigned int* 타입의 변수를 넣어두면 된다 uintptr_t _begin..

공부/운영체제 2022.01.22

C++ vector의 resize vs reserve

vector에는 resize 함수와 reserve 함수가 있다. 언뜻 보기에 같은 동작을 하는 것 처럼 보이지만 다른 동작을 하는 함수다. void resize (size_type n, value_type val = value_type()); vector는 미리 할당된 공간에 element를 채우면서, 할당된 공간이 모두 차면, 2배 크기의 새로운 공간을 할당해서 element를 옮겨준다. 여기서 말하는 '미리 할당된 공간'을 capacity라고 하며, 'element가 실제로 들어있는 공간'을 size라고 부른다. 예를 들어서 벡터에 미리 할당된 공간이 4개라고 가정하고, 1,2,3 각각을 vector에 push_back했다고 가정해보자. vector vec; vec.push_back(1); vec.p..

공부/C || C++ 2021.08.25

Linked list 구현

Linkedlist.h (템플릿으로 구현해서 헤더파일에 구현까지 넣음) #pragma once template class CNode { // 생성자, 소멸자를 privated으로 두고 CLinkedlist를 friend로 선언해서 // 외부에선 생성못하고 CLinkedlist만 생성할 수 있도록 함 private: CNode() {} ~CNode() {} private: template friend class CLinkedlist; template friend class CIterator; private: CNode* m_Next; CNode* m_Prev; T m_Data; }; template class CIterator { private: template friend class CLinkedlist..