Graphics
-
[37] - GeneratorsGraphics 2021. 8. 10. 14:08
Fill부터 살펴봅니다. 설명대로 어떤 Container를 채워주는 기능을 합니다. std::vector에 대해서 이 작업을 수행할 수도 있습니다. 하지만 벡터의 경우엔 자체적으로 초기화가 가능하며 Fill을 구태여 호출할 필요가 없습니다. 이 함수를 사용할 경우라면 벡터의 크기를 바꾸고 다시 채워넣을 필요가 있을 때 정도일 것입니다. 혹은 기존의 컨테이너 중간에 값을 삽입하거나 하는 기능에 활용할 수도 있습니다. 그런데 std::fill은 일관적인 값으로만 컨테이너를 채워줄 수 있습니다. 그게 아니라면 std::copy를 사용하는 편이 나을 것입니다. 만약 어떤 컨테이너의 특정 구간을 상승하는 값으로 채워주고 싶다면 std::iota를 사용할 수 있습니다. 아래의 실험적 코드를 보면 흥미로운 점이 있는..
-
[36] - find, search, reverse iteratorsGraphics 2021. 8. 10. 12:45
다양한 Overloaded Functions가 존재합니다. 가장 단순한 함수는 Container의 특정 범위 내에서 value의 값을 찾아서 해당 iterator를 반환하는 첫 번째 함수입니다. 그 왜에더 Unary Predicate가지 지원하는 모습을 확인할 수 있습니다. 반환형이 iterator라는 점을 염두에 두고 간단하게 활용하며 몸에 익힙니다. 완전히 일치하지 않는 단어는 찾아주지 못합니다. 예를 들어서 Acht의 'ch'만 입력해서는 찾아주지 못한다는 뜻입니다. 그런 함수가 있는 한편 std::find_first_of라는 함수는 일정 범위 안의 Container에서 다른 Container의 범위에 존재하는 요소가 가장 먼저 발견되면 해당 iterator를 반환합니다. x의 Delimiter 중..
-
[35] - count, all, none_ofGraphics 2021. 8. 9. 22:16
이들에 대해 간략하게 알아봅니다. std::count 위와 같은 형식을 취합니다. 기능은 어떤 척도에 맞는, 특정 범위의 Container 속에 포함된 원소들의 개수를 구합니다. 코드를 조금 써보는 것이 좋겠습니다. 복잡하지도 않고 유용합니다. 벡터 a에는 총 세 개의 2가 있습니다. 그러면 결과는 3이 나와야 합니다. 실제로 코드를 실행하면 3이 나옵니다. 이것보다 훨씬 복잡한 것도 가능할 겁니다. 가령, 단순히 2를 세는 것이 아니라 3보다 크거나 같은 값을 찾아서 출력하는 것도 가능할 것입니다. 왜냐하면 count의 overload function 중에서 (3)번을 보면 마지막 parameter에 UnaryPredicate를 넣을 수 있기 때문입니다. Lambda를 이용하면 될 것 같습니다. 7개가..
-
[34] - Transform, For_eachGraphics 2021. 8. 9. 16:16
이전에 했던 내용이긴 합니다. 그런데 Transform이라는 함수가 추가었습니다. 논리적으로는 두 함수는 같은 기능을 합니다. 어떤 Container의 원소들에 대해서 어떤 함수, predicate를 적용하는 것입니다. 그런데 설명을 읽어보면 미묘하게 다르다는 사실을 깨닫게 됩니다. Transform을 유심히 살펴보도록 합니다. (1)번의 정의를 보면 느낌이 옵니다. 어떤 Container의 범위에 대해서 Unary Operation을 수행하고 그 결과값을 다른 공간에 저장하는 역할을 수행합니다. 참고로 unary operation이란 operand(예를 들어서 +,-,%,/ 등등)가 하나만 있는 수식을 의미합니다. Unary operation -> (https://www.geeksforgeeks.org..
-
[33] - Remove_ifGraphics 2021. 8. 9. 14:37
Ref 1. (https://en.cppreference.com/w/cpp/algorithm/remove) std::copy에 이어서 유용하게 쓸 수 있습니다. 정의는 다음과 같이 되어 있습니다. 일반적으로 삭제를 감행할 Container이든 무엇이든 범위를 주고 predicate를 설정합니다. 사용법은 마치 copy_if와 다르지 않은 것처럼 느껴집니다. 참고로 Predicate는 boolean을 반환해야 합니다. 이 함수의 작동 방식을 vector를 통해 설명할 수 있습니다. { 1, 2, 3, 4, 5, 6, 7, 8, 9 } 를 격납하고 있는 vector가 있다고 가정하고 2,3,5,7을 제거한다 하면 iterator는 1부터 시작해서 각 원소에 대해 Predicate를 검증합니다. 1은 넘어가고..
-
[32] - Copy and FilterGraphics 2021. 8. 9. 13:08
기본적으로 D3D의 파이프라인을 구성은 했지만 내부 구조를 구성하는 디테일을 이해하려면 c++의 몇 가지 요소들을 이해하는 것이 필요합니다. 적어도 사용하려는 Engine이 어떤 구성으로 어떻게 돌아가는지, C++어떠한 특징을 이용한 것인지 설명을 할 수 있어야 합니다. 가장 자주 사용하는 라이브러리인 부터 차근차근 살펴보도록 합니다. 으로 검색을 하면 언제나 그렇듯 (https://en.cppreference.com/w/cpp/algorithm)여기로 연결 됩니다. 그러나 이걸 하나씩 읽는 건 거의 불가능에 가깝습니다. ChiliD3DFramework에 쓰인 핵심적인 내용들만 살펴봅니다. 그리고 이번에는 Copy에 대한 내용을 살펴봅니다. 지금 C++20표준이 갱신되어 있으나 Chili의 Framewo..
-
[31] - (C++) For each, Move Semantics, Lambdas, Uniform Initialization - 3Graphics 2021. 8. 5. 15:12
Lambdas 오래 전에 웹 파이썬 프로그래밍 수업을 들을 때 처음 접했던 개념입니다. 학기가 끝나갈 무렵, 앞으로 이런 것들을 공부할 것이라며 알려주었던 기억이 납니다. 전날 눈이 쏟아져 온세상이 차분하게 가라앉은 어느 겨울이었습니다. 돌이켜보면 그 순간과 지금 이 순간 저는 별로 변한 것이 없습니다. 참 괴로운 일이 아닐 수 없습니다. MSDN의 기본적인 설명은 Lambda는 함수의 argument나 촉발된 곳에서 Anonymous function object의 정의를 간편하게 해주기 위해 C++11 표준부터 지원된 기능이라고 합니다. Anonymous Function(closure)역시 lambda의 다른 이름입니다. 더 엄밀하게 표현을 하면 closure는 lambda expression을 Enc..
-
[30] - (C++) For each, Move Semantics, Lambdas, Uniform Initialization - 2Graphics 2021. 8. 3. 21:24
아직 Move semantics에 대한 이야기가 끝난 것이 아닙니다. 이 move constructor가 언제 호출되는지 알아야 실험 코드를 작성하든 말든 할 것입니다. 그런데 어떤 상황에서는 move ctor가 호출이 되어야 하는데 호출이 안 되는 경우가 있었습니다. 반대로 안 되어야 하는데 되는 경우도 있었습니다. 그래서 애를 많이 먹었는데 이유를 찾아보니 C++17 표준부터 규칙이 약간 바뀌었다는 점과 컴파일러에 달렸다는 사실을 알게 되었습니다. 그리고 오류가 나지 않은 것은 단순히 운이 좋았던 것 뿐이라는 사실도 알았습니다. 기본적으로 다음의 이유들이 move ctor을 invoke합니다. 1. 어떤 object가 std::move로 생성될 때. 2. 어떤 object가 std::forward(s..