표준 라이브러리 Phobos
에서 제공하는 std.range 와 std.algorithm 에는 코드 가독성은 높이면서도 범위(Range) 로 구성된 값들을 효율적으로 다룰 수 있게 해주는 함수들이 있습니다.
범위 탐색에 필요한 인터페이스를 구현해놓기만 한다면, 프로그래머가 직접 만든 타입으로도 표준 라이브러리에서 제공하는 모든 알고리즘을 이용할 수 있기 때문에 꽤나 편리하다고 할 수 있겠습니다.
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));
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);