목록C++ (102)
음악, 삶, 개발
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 하고자할수있다. 이를 위해서는 나의 클래스 내부에 연산자
C+11 에서는 constructor 의 재사용을 허용한다. class SomeType { public: SomeType(int new_number) : number(new_number) {} SomeType() : SomeType(42) {} private : int number; }; 참고 링크 Reusable constructors C++ Object construction improvement
Juce 로 미디이펙트를 만들기위한 가장 필수적인 지식들과 예제코드들을 정리해보려한다. 이 포스트는 VST3 플러그인 기준이며, Standalone 이나 iOS 는 해당되지않는다. Max 에서는 미디 메세지의 움직임은 모두 MSP object 가 아닌, Max object 에서 일어난다. 하지만 Juce 는 그렇지않다. 미디의 입,출력이 audio thread, 즉 processBlock() 안에서 일어난다. void processBlock(juce::AudioBuffer& audioBuffer, juce::MidiBuffer& midiBuffer) override { /* 이안에서 지지고볶고 하는것이다. */ } processBlock() 함..