Menu

범위 탐색 알고리즘 모음(Range algorithms)

표준 라이브러리 Phobos 에서 제공하는 std.rangestd.algorithm 에는 코드 가독성은 높이면서도 범위(Range) 로 구성된 값들을 효율적으로 다룰 수 있게 해주는 함수들이 있습니다.

범위 탐색에 필요한 인터페이스를 구현해놓기만 한다면, 프로그래머가 직접 만든 타입으로도 표준 라이브러리에서 제공하는 모든 알고리즘을 이용할 수 있기 때문에 꽤나 편리하다고 할 수 있겠습니다.

std.algorithm

filter - 람다(lambda) 식을 템플릿 값으로 전달하여 범위 탐색으로 값을 걸러냅니다. 값이 두 개 이하일 때는 첫번째 값을 a 로, 두번째 값을 b 로 놓은 문자열을 람다 함수 대신 전달할 수 있다는 걸 기본 강좌의 델리게이트(delegate) 섹션에서 설명했습니다.

    filter!"a > 20"(range);
    filter!(a => a > 20)(range);

map - 템플릿 값으로 전달된 람다함수를 범위 탐색 의 모든 값에 적용 후, 그 결과값을 반환합니다

    [1, 2, 3].map!(x => to!string(x));

each - foreach 를 단순하게 이용할 수 있습니다.

    [1, 2, 3].each!(a => writeln(a));

std.range

take - 범위 탐색을 하여 최초 N 개의 자료만 가져옵니다.

    theBigBigRange.take(10);

zip - 입력값으로 범위 탐색이 가능한 값 두 개를 받아, 각각의 순서에 맞춰 두 값을 하나의 튜플(tuple)로 묶어줍니다.

    assert(zip([1,2], ["hello","world"]).front
      == tuple(1, "hello"));

generate - 입력값으로 값을 반환할 수 있는 함수를 받아, 범위 탐색시 매번 그 함수를 호출해 값을 생성하는 함수를 만듭니다.

    alias RandomRange = generate!(x => uniform(1, 1000));

cycle - 입력된 범위 탐색 타입을 계속 돌아가며 탐색할 수 있게 만들어줍니다.

auto c = cycle([1]);
// 보통의 범위 탐색 타입은 empty 상태가 되어 끝나지만,
// cycle을 통과하면 그렇게 될 수 없습니다. 끝나지 않습니다.
assert(!c.empty);

표준 라이브러리 문서를 더 살펴보시는 걸 권합니다

더 살펴보기

rdmd playground.d