728x90

Ranges는 STL에서 제공되던 iterator의 확장 버전처럼 보인다.

Range : STL 컨테이너를 순회할 수 있는 그룹
View : Range에 대해서 적용할 수 있는 연산

C#의 LINQ 문법과 비슷하다.

키워드 

// std::views::all		
// std::ranges::filter_view / std::views::filter (조건 만족하는거 추출)
// std::ranges::transform_view / std::views::transform (각 요소를 변환)
// std::ranges::take_view / std::views::take (n개 요소를 추출)
// std::ranges::take_while_view / std::views::take_while (조건 만족할 때까지 요소 추출)
// std::ranges::drop_view / std::views::drop (n개 요소를 스킵)
// std::ranges::drop_while_view / std::views::drop_while (조건 만족할 때까지 요소 스킵)
// std::ranges::join_view / std::views::join (view 를 병합)
// std::ranges::split_view / std::views::split (split)
// std::ranges::reverse_view / std::views::reverse (역순서로 순회)
// std::ranges::elements_view / std::views::elements (튜플의 n번째 요소를 대상으로 view 생성)
// std::ranges::keys_view / std::views::keys (pair-like value의 첫번째 요소를 대상으로 view 생성)
// std::ranges::values_view / std::views::values (pair-like value의 두번째 요소를 대상으로 view 생성)

 

벡터의 값들 중에 짝수를 추출해서 2를 곱해준다는 것을 코드로 구현한다면

예전 코드

vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

vector<int> v2;
// 짝수를 추출해서
for (int n : v1)
	if (n % 2 == 0)
		v2.push_back(n);
        
// 2를 곱해준다
for (int& n : v2)
	n = n * 2;

view를 이용한 코드

vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

auto results = v1 | std::views::filter([](int n) { return n % 2 == 0; })
                  | std::views::transform([](int n) { return n * 2; });

 

정렬 방법

vector<int> v1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

std::sort(v1.begin(), v1.end()); // 예전 방식
std::ranges::sort(v1);			 // range를 이용한 방식

 

ref - https://openmynotepad.tistory.com/87

 

C++20) Ranges - 1

1장에서는 Ranges의 기본적인 개요와 view를 다룹니다. 2장에서는 Action을 다룹니다. C++20 에서 Actions가 추가되지 않았습니다. ( 추가가 안된 것은 아니고, namespace 가 추가되지 않음 ) 그에 따라, action

openmynotepad.tistory.com

https://openmynotepad.tistory.com/88

 

C++20) Ranges - 2

views::drop 우리가 문자열 트리밍을 한다고 생각해봅시다. 즉, 어떠한 문자열이 들어오면, 선행/후행 공백이 제거된 새 문자열을 구성하려고 합니다. 예를 들어, "\n\t\r Hello World! \n\n" 를 "Hello World!"

openmynotepad.tistory.com

 

728x90

'Basic Programming > C++ 20' 카테고리의 다른 글

C++20 - 지정된 초기화 (Designated Initialization)  (1) 2023.12.17
C++20 - 삼항 비교 연산자(Three-Way Comparison)  (0) 2023.12.17
C++20 - Coroutine  (1) 2023.12.17
C++20 - Module  (0) 2023.12.10
C++20 - Concepts  (0) 2023.12.10

+ Recent posts