[ C++ 20 ] Range

Minsu._.Lighting·2024년 2월 17일
0

📔 [ Modern C++ / C# ]

목록 보기
3/8

💡 Range?

  • C#의 LINQ와 문법과 유사

  • Concept, Module, Coroutine에 비해 중요도가 떨어지는 문법
    - 하지만 기능은 유용하게 사용 가능


💡 Range를 사용하는 이유?

📌 보다 가독성 좋게 코드를 작성할 수 있다.

  • 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 사용 방법!

📌 Range와 View

  • Range : 순회할 수 있는 아이템 그룹
    - STL 컨테이너 등

  • View : Range에 대해서 적용할 수 있는 연산

📌 Range와 View 주요 기능들

  • 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 생성


💡 Range 사용 예시!

📌 sort 활용

  • 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);
}

📌 커스텀 view (std::ranges::view_interface)

  • 원하는 조건을 커스텀해서 만들 수 있다
    - 사용할 일이 잘 없을 것, 알고만 있어도 무방
profile
오코완~😤😤

0개의 댓글

관련 채용 정보