목록개발 공부/C++ 약점공략 (30)
음악, 삶, 개발
오름차순으로 std::sort() 를 사용하기위해서는 operator< r가 오버로딩 되어야한다. bool operator< (const Note& other) const { return getStart() < other.getStart(); } 이때 이 operator< 함수뒤에 const 를 반드시 반드시 붙여야한다. 그렇지않으면 함수를 호출할때 error 가 날것이다. 이 const 가 필요한 이유는 너무도 당연하다. 우리는 < 로 두 객체를 비교하는것이지, 객체의 상태를 변화시키는것이 아니기때문이다.
C++ 에서 Move 의 의미는 이삿짐 센터라고 외우자. 현실 세계에서 이사는 한 집의 짐을 다른 집으로 다 옮기는것이지만, C++ 에서는, 한 집에서의 모든 값을 다른 집에 복사해주고, 복사를 마치면 남의 집의 값을 각 type 이 제공하는 방법으로 초기화하는것이다. 예를 들어 완전히 이해해보자. T 라는 우리가 만든 클래스가 있다. strcut T { int a; double b; float c; } 이 클래스 유형을 가진 두개의 객체 A, B 가 있고 A 를 B 로 Move 한다고 가정해보자. 이때 발생하는 실제 프로세스는 아래와 같다. 1. 객체 A 의 모든 멤버 a, b, c 의 값을, 객체 B 의 멤버 a, b, c, 의..
일종의 포인터라서 값을 얻기위해서는 Dereference, 즉 * 를 사용하여 역참조해야한다. 아래의 코드를 보자. int main () { std::vector vec {1, 2, 3, 4}; std::cout
vector 의 iterator 용령은 8 byte (64 bits) 이다. double 과 같은 용량이니, 복사하는것을 두려워하지말라. 단, 무효화된 iterator 를 사용하는것을 매우 매우 두려워하라.
무조건 sizeof() 함수를 사용하여 크기를 찍어보아야한다. Peter 말에 의하면, 128 bits 이상이면 reference 로, 이하면 value 로 return 하는게 일반적이라고한다. 예를 들어보자. double 은 8 byte 즉, 64 bits 이다. (1 byte 당 8 bits) 이럴때는 그냥 value 를 return 하자. double getDouble() const {} get 함수는 무언가를 수정할 의도가 없으니, 항상 뒤에 const 를 붙이자. const 가 붙은 함수는, non-const 객체가 호출할수없다. 아래의 경우를 보자. const juce::Range& getRange() const {} juce::Range 타입은 두개의 double 로 이루어져 128 bits..
이 2가지를 외우자. erase : vector 의 요소를 삭제한다. remove : vector 의 요소를 이동시킬뿐. (= Move assignment 를 호출한다), 요소를 삭제하지않는다. 따라서 이 2가지가 적절히 섞여야한다. 아래의 코드를 암기하여 사용하도록 한다. int main() { std::vector vec {1, 2, 3, 4}; // remove a element by index vec.erase(vec.begin() + 1); // remove elements between the index vec.erase(vec.begin(), vec.end() - 1); // remove elements by value vec.erase(std::remove(vec.begin(), vec.e..
vector 가 가지고있을 클래스의 크기를 고려해야한다. 이 클래스가 매우 거대하다면, 1개를 지우려고하면, 다른 요소들을 하나씩 좌측으로 옮기기위해 수많은 Move Assignment 함수를 호출해버리는 erase() 같은 함수는, 나의 프로그램의 큰 성능 저하를 가져올수있기때문이다. 이에 대해 Peter 와 대화를 나누었고 아래와 같은 대답을 하였다. When a class is 128 bits or less, it’s cheaper to pass by value than reference is the guideline I’ve heard. The smaller something is, the cheaper it is to do operations on it (usually). ..
vector 에는 요소를 추가, 삭제하는 다양한 함수들이 존재한다. 우리는 그저 무심코 "요소를 추가하면 되고, 삭제하면 되고"라고 생각할것이다. 내가 지금까지 그랬다. 하지만 vector 가 내가 원하는 컨테이너인지 정확히 이해하기위해서, 또한 성능의 향상을 위해서는.. 각 함수가 호출되었을때 내부적으로 무슨일이 생기는지를 알고있어야한다. 이 무슨일이 생기는지를 이해하면 다른 컨테이너와 장,단점을 서로 비교할수있게될것이다. 각 함수에 따라 무슨일이 발생하는지를 파해쳐보려한다. void print(const char* str) { std::cout
C++ 에는 매우 많은 컨테이너들이 있다. 나는 당연히 vector 가 최고인줄 알았지만, 그렇지않았고 각 컨테이너들마다 장,단점이 성능적으로 존재하였다. 따라서, 어느 컨테이너가 절대적으로 우월하지않은것이다. 각 컨테이너들간의 장,단점을 무조건 알고있어야하고, 이들을 비교하여 설명할수있어야한다. 그래야만이 내가 설계하려는 데이터 구조에 따라 적절한 컨테이너를 선택할수있는것이다. cppreference : Containers cplusplus : Containers How to Remove Elements from a Sequence Container in C++ How to Remove Elements from an..
std::map 은 key 와 value 로 이루어진 container 이다. std::map 은 key 가 unique 해야하지만, std::multimap 은 동일한 key 를 여러 객체에 중복하여 사용할수있다. 이외에는 사용법이 동일하여 std::map 으로 일단 설명하겠다. 을 추가하기 std::map 또는 std::multimap 을 사용하기위해서는 #include 을 코드에 추가해야한다. 따로 #include 은 없다는것을 기억하자. #include map 생성하기 std::map m; // key : double, value : int map 객체를 생성하기위해서는 를 명시해야한다. 위의 코드에서 key 는 double, value 는 int 이다. map 에 요소를 추가하기 : emplac..