반응형
C++23에서는 비동기 프로그래밍과 스레드 관리 패턴을 한층 더 간단하고 효율적으로 만들기 위해 std::in_place_stop_source와 std::in_place_stop_token이 도입되었습니다. 이들은 C++20에서 도입된 std::stop_source와 std::stop_token을 개선한 것으로, 비동기 작업이나 스레드 실행을 안전하고 직관적으로 중단(stop)할 수 있는 메커니즘을 제공합니다.기존의 std::stop_source/std::stop_token과 달리, in_place 버전은 무상태(stateless)로, 저장 비용이 줄고 더 가벼우며, 기본적으로 커스텀 메모리 관리나 동기화 없이도 안전하게 중단 신호를 전달하고 처리할 수 있습니다.이번 글에서는 std::in_place_s..
C++23에서는 범위(Range) 라이브러리를 더욱 강화하기 위해 다양한 뷰(View) 어댑터가 추가되었습니다. 그중 std::views::repeat와 std::views::repeat_n는 특정 값을 무한히 반복하거나, 지정된 횟수만큼 반복하는 시퀀스를 손쉽게 만들 수 있도록 해주는 뷰 어댑터입니다. 이를 통해 반복적인 데이터 소스를 간편하게 생성할 수 있으며, 다른 범위 어댑터와 결합하여 여러 가지 흥미로운 데이터 처리 파이프라인을 구성할 수 있습니다. 이번 글에서는 std::views::repeat와 std::views::repeat_n의 개념과 사용법, 그리고 이전 방식과 비교하여 어떠한 개선점을 제공하는지 알아보겠습니다. std::views::repeat란 무엇인가요?std::views::re..
C++23에서는 범위(Range) 라이브러리를 더욱 유연하고 표준화된 방식으로 다룰 수 있도록 하는 새로운 뷰(View) 어댑터들이 다수 추가되었습니다. 그중 하나인 std::views::common는 범위를 일반 범위(common_range)로 변환하여, 반복자와 센티넬 타입 불일치 문제를 해결하고, 다른 범위 기반 알고리즘과의 호환성을 개선하는 뷰 어댑터입니다. 이를 통해 범위를 다룰 때 흔히 발생하는 반복자-센티넬 타입 차이로 인한 번거로움을 줄이고, 코드 가독성과 유지보수성을 높일 수 있습니다.이번 글에서는 std::views::common의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 알아보겠습니다.std::views::common란 무엇인가요?C++20 범위 라이브러리에..
C++23에서는 범위(Range) 라이브러리에 다양한 알고리즘들이 추가되어, 데이터 처리 파이프라인을 한층 더 풍부하게 구성할 수 있게 되었습니다. 그중에서도 std::ranges::drop_last와 std::ranges::drop_last_while 함수는 범위의 끝부분에서 특정 개수나 조건에 맞는 원소들을 제거(drop) 하는 기능을 제공합니다. 이를 통해 기존의 std::ranges::drop가 범위의 앞부분을 제거하는 것에 더해, 뒷부분에 대해 유사한 조작을 간단하게 수행할 수 있게 되었습니다.이번 글에서는 std::ranges::drop_last와 std::ranges::drop_last_while의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 살펴보겠습니다.std::r..
C++23에서는 다양한 범위 라이브러리 및 형식화 출력, 오류 처리 기능 외에도, 기본 알고리즘을 확충하여 언어의 활용성을 높였습니다. 그중 하나인 std::byteswap 함수는 정수 타입의 바이트 순서(Byte order)를 간단히 역전시켜주는 함수로, 네트워크 프로그래밍이나 이진 파일 입출력, 하드웨어 종속적인 데이터 처리 등에서 유용하게 활용할 수 있습니다. 이 기능을 통해 개발자는 별도의 매크로나 사용자 정의 함수를 만들 필요 없이, 표준 라이브러리 함수 한 번의 호출로 정수 바이트 순서를 반전할 수 있습니다.이번 글에서는 std::byteswap의 개념과 사용법, 그리고 이전 방식과 비교하여 어떤 점이 개선되었는지 알아보겠습니다.std::byteswap란 무엇인가요?std::byteswap(T..
앞서 기본 구현을 통해 groupby, permutations, product를 C++로 옮기는 방법을 살펴봤습니다. 여기서는 C++20의 Concepts와 Ranges 라이브러리를 활용해 정교한(또는 확장된) 구현 방법을 간단히 예시로 보여드리겠습니다.파이썬스럽다는 것은 단순히 기능을 흉내내는 데 그치지 않고, 타입 안정성, 가독성, 모듈성까지 고려하는 것입니다. Concepts로 입력 타입을 제약하거나, Variadic Template로 product를 여러 컨테이너에 확장하는 예제를 살펴보죠.정교한(또는 확장된) 구현 예제1. groupby에 Concepts 적용하기groupby는 연속된 원소를 key 함수 결과에 따라 그룹화합니다. 여기서 key 함수는 원소를 받아 어떤 key로 매핑하는 Call..
이제까지 파이썬 itertools와 more-itertools의 다양한 함수를 C++로 옮기며, 현대 C++이 제공하는 Ranges, Concepts, lazy evaluation을 통해 얼마나 파이썬스러운 코드를 구현할 수 있는지 확인했습니다. 이번에는 takewhile, dropwhile, 그리고 accumulate를 C++에서 흉내 내는 방법을 살펴보겠습니다.먼저 파이썬에서 이 함수들이 어떻게 동작하는지 간단히 살펴볼까요?from itertools import takewhile, dropwhile, accumulate# takewhile(predicate, iterable)# predicate가 참인 동안만 원소를 반환하다가, 거짓이 되는 순간 멈춤data = [1,2,3,4,5,1,2]for x ..
여러분, 우리는 지금까지 파이썬 itertools와 more-itertools의 다양한 기능을 C++20/23 문법으로 흉내 내는 방법을 살펴보며, 파이썬스러운 추상화를 C++에서 어떻게 구현할 수 있는지 탐구해왔습니다. 이번 글에서는 unique_everseen, unique_justseen, 그리고 powerset를 C++로 옮겨보며, 더욱 풍부한 반복 패턴을 구현하는 방법을 알아보겠습니다.먼저 파이썬에서 이들 API를 간단히 살펴볼게요.from more_itertools import unique_everseen, unique_justseenfrom itertools import chain, combinations# unique_everseen(iterable)# 지금까지 본 적 없는 원소만 내보냄 ..
여러분, 지난 글들에서 우리는 파이썬 itertools와 more-itertools의 다양한 기능을 C++20/23 문법으로 흉내내는 방법을 탐구해왔습니다. 이번에는 grouper, intersperse, flatten이라는 세 가지 기능을 살펴보며, C++로도 충분히 파이썬스러운 추상화를 구현할 수 있음을 확인해보겠습니다. 먼저 파이썬에서의 해당 API를 간단히 살펴볼게요. grouper, intersperse, flatten는 more-itertools나 itertools 관련 라이브러리로 자주 사용할 수 있는 패턴입니다.from more_itertools import grouper, intersperse, flatten# grouper(iterable, n, fillvalue=None)# itera..
그동안 다양한 itertools 기능을 C++로 옮기는 방법을 살펴봤습니다. 파이썬 itertools는 시퀀스를 다루는 멋진 아이디어를 끊임없이 제공하는데, 이번에는 chain.from_iterable와 batched 두 가지를 살펴보려 합니다. 특히 batched는 파이썬 3.11에서 새롭게 추가된 함수로, 이 역시 매력적인 기능입니다. 먼저 파이썬에서 이 두 함수를 간단히 소개해볼게요.from itertools import chain, batched# chain.from_iterable(iterable_of_iterables)는 이중 iterable을 평탄화# 예: [[1,2],[3,4,5],[6]] -> 1,2,3,4,5,6list_of_lists = [[1,2],[3,4,5],[6]]for x i..