반응형
앞선 글들에서 우리는 파이썬의 range, enumerate, zip, map, filter와 같은 편리한 함수형 API를 C++20/23 문법과 Ranges 라이브러리 등을 통해 “파이썬스럽게” 구현하는 방법을 살펴보았습니다. 이번 글에서는 한 단계 더 나아가, 파이썬의 itertools 라이브러리가 제공하는 몇 가지 대표적인 툴을 C++ 스타일로 흉내 내보려 합니다. itertools는 파이썬에서 반복 가능한(iterable) 시퀀스를 다루는 데 매우 유용한 툴셋을 제공합니다. 그중에서도 chain, takewhile, dropwhile는 다양한 컨테이너나 이터러블을 직관적이고 유연하게 다룰 수 있게 해줍니다. 글의 구성은 다음과 같습니다:일반적인 C++ 구현 (Before): 파이썬 chain, t..
앞선 글들에서 우리는 파이썬의 range, enumerate, zip와 유사한 C++ 구현 방식을 살펴보았습니다. 파이썬의 직관적 문법을 C++20/23의 언어와 라이브러리 기능들을 통해 비교적 쉽게 재현할 수 있음을 확인했죠. 이번 글에서는 파이썬에서 자주 사용하는 함수형 스타일의 API인 map과 filter를 C++에서 어떻게 “파이썬스럽게” 구현할 수 있는지 다뤄보겠습니다. 파이썬의 map(function, iterable), filter(predicate, iterable)를 C++20/23에서 비슷한 느낌으로 쓸 수 있다면, 복잡한 로직을 더 간결하고 깔끔하게 표현할 수 있습니다. 글의 구성은 다음과 같습니다:일반적인 C++ 구현 (Before): 람다, std::transform, std::..
지난 글에서 우리는 파이썬의 range, enumerate를 C++20/23 스타일로 구현해보며 파이썬스러운 간결성과 C++의 성능을 결합하는 방법을 살펴보았습니다. 이번 글에서는 파이썬에서 자주 사용하는 또 하나의 유용한 함수 zip을 다뤄보겠습니다.파이썬의 zip은 여러 이터러블(리스트, 튜플 등)을 병렬로 순회하며 각 원소를 튜플로 묶어 돌려줍니다. 예를 들어:for x, y in zip([1,2,3], ['a','b','c']): print(x, y)이렇게 하면 (1, 'a'), (2, 'b'), (3, 'c') 순으로 받을 수 있습니다. C++에서 이와 비슷한 기능을 구현하려면 어떻게 할까요? C++17 이전에는 주로 인덱스를 수동 관리하거나, Boost 라이브러리를 쓰거나, 범위 기반 f..
C++ 코드를 작성하다 보면, 파이썬의 range, enumerate 같은 직관적이고 깔끔한 반복 구문이 부러울 때가 있습니다. 예를 들어 for i in range(10)라고만 쓰면 0부터 9까지 편하게 순회할 수 있고, for idx, val in enumerate(obj)로 인덱스와 값을 동시에 받아오는 문법은 가독성을 크게 높여줍니다. 이 글에서는 C++17, C++20, C++23에 걸쳐 제공되는 기능들을 활용해 파이썬스러운 API를 구현하고, 다양한 상황에서의 사용 예제와 성능, 유연성에 대해 살펴보겠습니다. 구성은 다음과 같습니다:일반적인 C++ 구현 (Before)기존 C++ 스타일로 인덱스와 값을 처리하는 방식.단순한 Python 같은 C++ 구현 (After: 첫 단추)C++17에서도 ..