Was ist der Unterschied zwischen irange
und counting_range
?
Ich brauchte irange
, um schnell einen Bereich von ganzen Zahlen wie diesem zu erzeugen:
Aber bemerkt irgendwo ein Beispiel (die Verbindung verloren), die stattdessen über counting_range
spricht, um die gleiche Aufgabe zu erfüllen. Gibt es eine einfache Erklärung für den Unterschied zwischen diesen beiden?
Der Hauptunterschied ist, dass irange
ist ein Random-Access-Bereich während counting_range
nicht ist . counting_range
basiert auf Boost.Iterators counting_iterator
, das alle zugrunde liegenden Integer-Operationen direkt verwendet . Ganzzahlen in C ++ passen fast zum Iterator-Konzept: Das einzige, was fehlt, ist operator*
. counting_iterator
stellt eine operator*
als Identity-Operation bereit und leitet alles andere an den zugrunde liegenden Typ weiter.
Ein weiterer Unterschied ist, dass irange
auch andere Inkremente als 1 unterstützt.
Keiner von ihnen materialisiert jemals den gesamten Bereich von ganzen Zahlen, über die sie iterieren, also benutzen sie beide O (1) Speicher.
Sowohl irange
und counting_range
modellieren einen zufälligen Zugriffsbereich für Integer-Typen. Wie die Dokumentation von counting_range
s zeigt, wird ihre Iterator-Kategorie nach folgendem Algorithmus bestimmt:
Daher gibt es für einfache Bereiche wie boost::irange(0, 10)
und boost::counting_range(0, 10)
praktisch keinen Unterschied (abgesehen von den Typen jedes Bereichs natürlich!).
irange
unterstützt jedoch auch Iterationen mit einer anderen Schrittgröße, z. B. boost::irange(0, 10, 2)
, und counting_range
unterstützt auch Typen, die nur inkrementierbar sind und eine Ganzzahl nicht vollständig modellieren.