C++ Ranges – Eine Einführung

Die Standardbibliothek bietet Algorithmen sowohl beschränkt durch Konzepte als auch unbeschränkt (aus Gründen der Kompatibilität) an. Die beschränkten (Konzept-)Versionen finden sich in <ranges> im Namensraum ranges. Natürlich bevorzuge ich die Versionen, die Konzepte benutzen. Ein range ist eine Verallgemeinerung der C++98-Sequenzen, die durch {begin(),end()}- Paare definiert werden; er legt fest, was nötig ist, um eine Sequenz aus Elementen zu sein. Ein range kann definiert sein durch:  

  • ein {begin,end}-Paar aus Iteratoren
  • ein {begin,n}-Paar, bei dem begin ein Iterator und n die Anzahl der Elemente ist
  • ein {begin,pred}-Paar, bei dem begin ein Iterator und pred ein Prädikat ist; wenn pred(p) für den Iterator p true ist, haben Sie das Ende des Bereichs erreicht. Dies erlaubt es Ihnen, unendliche Bereiche sowie Bereiche zu benutzen, die »on the fly« generiert werden (§14.3).

Dieses range-Konzept erlaubt es, sort(v) zu sagen statt sort(v.begin(),v.end()), wie Sie es mit der STL seit 1994 machen mussten. Sie können Vergleichbares für Ihre eigenen Algorithmen tun:

template<forward_range R>

requires sortable<iterator_t<R>>

void my_sort(R& r) // moderne, Konzept-beschränkte Version von my_sort

{

return my_sort(r.begin(),r.end()); // benutzt das sort im Stil von 1994

}

Durch das Verwenden von Bereichen ist es möglich, etwa 99% der häufigsten Anwendungen von Algorithmen konkreter auszudrücken. Zusätzlich zu dem Vorteil hinsichtlich der Notation bieten Bereiche einige Optimierungschancen und eliminieren eine ganze Klasse »Leichtsinnsfehler« wie sort(v1.begin(),v2.end()) und sort(v.end(),v.begin()). Ja, solche Fehler sind in »freier Wildbahn« schon gesehen worden. Natürlich gibt es unterschiedliche Arten von Bereichen, die mit den unterschiedlichen Arten von Iteratoren korrespondieren. Im Speziellen werden input_range, forward_range, bidirectional_range, random_access_range und weiterhin contiguous_range als concept dargestellt (§14.5).


Dieser Artikel ist ein Auszug aus dem Buch „Eine Tour durch C++“ von Bjarne Stroustrup. Alle Infos zum Buch, das Inhaltsverzeichnis und eine kostenlose Leseprobe findet ihr bei uns im Shop.

Kommentar verfassen