C#의 LINQ와 문법과 유사
Concept, Module, Coroutine에 비해 중요도가 떨어지는 문법
- 하지만 기능은 유용하게 사용 가능
vector
컨테이너의 짝수를 추출한 후 그 값들에 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.emplace_back(n);
// 추출 값에 2를 곱해줌
for(int& n : v2)
n = n * 2;
// 위와 같은 코드를 아래처럼 바꿔줄 수 있다.
auto results = v1 | std::view::filter([](int n) { return n % 2 == 0; })
| std::view::transform([](int n) { return n * 2; });
Range
: 순회할 수 있는 아이템 그룹
- STL 컨테이너 등
View
: Range
에 대해서 적용할 수 있는 연산
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
- 요소를 나눔
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 생성
std::ranges::sort(정렬 범위, 정렬 조건, 정렬 대상);
// 기존 sort 방법
std::sort(v1.begin(), v1.end());
// 위처럼 작성한 코드를 아래처럼 변경 가능
struct Monster
{
string name;
int id;
};
vector<Monster> Monsters =
{
{ "Golem", 1 },
{ "Wolf", 2 },
{ "Zombie", 3 },
{ "Skeleton", 4 },
};
std::ranges::sort(Monsters, {}, &Monster::Name); // Monsters 컨테이너 대상, 기본 정렬 조건(오름 차순), 이름 으로 정렬
std::ranges::sort(Monsters, greater(), &Monster::Name); // Monsters 컨테이너 대상, 내림 차순, 이름 으로 정렬
std::ranges::sort(Monsters, {}, &Monster::id); // Monsters 컨테이너 대상, 기본 정렬 조건(오름 차순), id값 으로 정렬
std::ranges::sort(Monsters, greater(), &Monster::id); // Monsters 컨테이너 대상, 내림 차순, id값 으로 정렬
0~100사이 숫자 중에 앞에서부터 5개의 소수 추출
std::views::iota(a, b)
: a부터 시작해서 1씩 증가, b개를 만들어 줌
auto isPrime = [] (int num)
{
if (num <= 1)
return false;
for (int n = 2; n*n <= num; n++)
if (num % n == 0)
return false;
return true;
};
std::vector<int> vecNum;
for (int n : std::views::iota(0, 100) | std::vies::filter(isPrime) | std::views::take(5))
{
vecNum.emplace_back(n);
}