공부/C || C++ 43

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

C++ std::list vs std::vector

vector list 원소를 contiguous memory에 저장 -> cache friendly할 것임 원소를 non-contiguous memory에 저장 내부적으로 동적 배열로 구현 내부적으로 doubly linked list로 구현 default size가 있으며 그 default size를 넘어갈 때 추가 할당을 위한 비용이 크다 default size가 없다 원소 하나 저장하는데 원소 크기만큼만 필요 원소 하나 저장하는데 원소 크기와 더불어 next, previous 포인터에 대한 메모리도 필요 Random access가능 doubly linked list로 구현되어 있어서 Random access가 불가능해서 iterator로 순회해야함 Reference: https://www.educba..

공부/C || C++ 2022.09.26

std::sort와 list::sort는 왜 따로 있을까?

std::vector는 std::sort로 정렬되지만 std::list처럼 전용 sort함수가 없다. 반대로 std::list는 전용 sort가 있지만 std::sort는 사용할 수 없다. 그러면 왜 std::list는 std::sort를 사용할 수 없을까 알아봤다 stackoverflow를 찾아보니 std::sort는 랜덤 엑서스가 가능한 std::vector나 std::deque만 사용 가능하다고 한다. 그래서 당연하게도 연관 컨테이너(Associative Container)에도 사용이 불가능하다 std::sort는 quick sort, heap sort, Insertion sort를 조합한 알고리즘인 Intro sort를 사용해서 내부적으로 구현되어 있다. std::list::sort는 구현에 따라..

공부/C || C++ 2022.09.25

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

C++ 클래스 상속, 다중 상속, 가상 함수 그리고 다형성(Inheritance & virtual function & polymorphism)

C++ 클래스와 상속 그리고 큰 특징 중 한가지인 다형성에 대해 알아볼 것이다. 그전에 상속과 관계 없지만 조금 신기한 것을 알게 됐는데, 아래처럼 클래스를 정의해놓고 아무런 멤버 변수를 선언하지 않고 size를 확인하면 신기하게도 1이 나온다. class CTest1 { }; struct CTest2 { }; int main() { CTest1 test1; CTest2 test2; std::cout

공부/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

C++ vector::push_back vs vector::emplace_back

지난 게시글인 Rvalue reference관해서 공부하다가 우연히 보게 된 건데 C++에 container들을 자주 써왔다고 생각했는데 push_back과 emplace_back에 performance 차이가 있을 수 있다는 이야기는 처음 들어봤다. 사실 emplace_back은 거의 안써보고 매번 push_back만 쓰기도 했다. 겉보기에 두개의 메소드 간에 차이가 없어보이는데 왜 다른 이름으로 두개가 존재하는건지 진작에 의문점을 가져봤어야 했는데... push_back과 emplace_back의 가장 큰 차이점은 "emplace_back은 내부적으로 가변 인자 템플릿 형태의 생성자가 구현되어 있다는 점이다" 그래서 결과적으로 두 함수에 생기는 차이는 push_back은 내부적으로 생성자가 없어서 외..

공부/C || C++ 2022.09.18

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

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

공부/C || C++ 2022.09.17

C++ std::move

C++ 11에서 Rvalue reference를 공부하다보니 처음보는 개념들이 너무 많이 쏟아져 나온다. 그중 하나가 std::move이다. 기능은 쉽게 이야기해서 lvalue를 rvalue로 전환해주는 것이 전부이다. 다만 B = std::move(A)를 한다면, A는 아무런 값도 갖지 않은 객체가 된다는 것을 인지해야한다. 이름이 move라고 해서 값을 옮겨준다거나 그렇게 하진 않는다. std::move는 주로 move 생성자에 많이 쓰인다. 아래 코드를 보면 왜 move 생성자에서 자주 쓰이는지 알 수 있다. (코드 출처 : https://openmynotepad.tistory.com/10) class Item { public: Item(const int _n) : m_nx(_n) { cout

공부/C || C++ 2022.09.05