Range Algorithmen

Die Standardmodule std.range und std.algorithm bieten eine Vielfalt an großartigen Funktionen, die, basierend auf Ranges als Grundbausteinen, zu komplexen Operationen zusammengefügt werden konnen, und dies auf eine lesbare Art und Weise.

Das Großartige an diesen Algorithmen ist die Anwendbarkeit auf eigens definerte Ranges, sodass direkt vom Reichtum der Standardbibliothek profitiert werden kann.

std.algorithm

filter - Generiert eine neue Range aus gefilterten Elementen, wobei die Filterbedingung als Lambdafunktion angegeben werden kann:

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

map - Generiert eine neue Range unter Benutzung des als Template-Parameter definierten Prädikats:

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

each - Alternative Variante von foreach für Ranges:

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

std.range

take - Begrenzt die Range auf N Elemente:

theBigBigRange.take(10);

zip - Iteriert parallel über zwei Ranges und bindet die Elemente zu Tupeln:

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

generate - Erzeugt eine Range basierend auf einer Funktion, die bei jedem Iterationsschritt aufgerufen wird, z.B.:

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

cycle - Erzeugt eine Range, welche die gegebene Eingangs-Range für immer wiederholt:

auto c = cycle([1]);
// Range wird nie leer werden!
assert(!c.empty);

Weiterführende Quellen

rdmd playground.d