목록개발 공부 (130)
음악, 삶, 개발
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..
결국 vector 간에 = 연산자를 사용할때 라고 말할수있다. std::vector vec1 {1, 2, 3, 4}; std::vector vec2; vec2 = vec1; // assignment operator 하지만 위와 같이 = 연산자를 써야할때 우리는 3가지의 경우로 나눌수있다. 1. vec1 에는 요소들이 있고, vec2 는 비어있을때. 2. vec1 은 비어있고, vec2 에는 요소들이 있을때. 3. vec1, vec2 둘다 요소들이 있지만 vec1 이 더 많은 요소를 가지고있을때. 4. vec1, vec2 둘다 요소들이 있지만 vec2 가 더 많은 요소를 가지고있을때. 나는 위와 같은 각 경우들을 실행했을때 실제로 무엇이 일어나는지 보고..
Cat 클래스의 객체를 가지고있는 Cats 클래스가 있다. 한개의 Cats 객체를 만드려할때, 기존의 Cats 객체를 복사하여 만드는 코드이다. Copy Constructor 안에서 range based for 루프를 사용하기위해, begin() 과 end() 를 정의해주어야한다. class Cat { public : Cat(int toAge) : age(toAge) {} int getAge() { return age; } private : int age; }; class Cats { public : Cats() {} Cats(const Cats& other) { for (const auto& cat : other) add(cat); } void add(const Cat& cat) { cats.push_..
int main () { std::vector v = { 0, 1, 2, 3, 4, 5 }; for (const int& i : v) // access by const reference std::cout
곧바로 vector 를 사용하지않고, 나의 클래스를 만들고 멤버로 vector 를 사용하는 경우가 자주있다. 이때는 vector 를 가지고있는 클래스안에 begin() 과 end() 함수를 아래와 같이 정의해주면 된다. class Cat { public : Cat(int toAge) : age(toAge) {}; int getAge() const { return age; } private : int age; }; class Cats { public : Cats() {} void add(const Cat& cat) { cats.push_back(cat); } /* to use range based for loop */ auto begin() { return cats.begin(); } auto begin(..
vector 가 내가 만든 클래스를 객체로 가지는 경우가 자주 발생한다. std::sort(begin(), end()) 를 사용하여 나의 vector 를 sort 하고자할수있다. 이를 위해서는 나의 클래스 내부에 연산자