Unterschied zwischen irange und counting_range in Boost

8

Was ist der Unterschied zwischen irange und counting_range ?

Ich brauchte irange , um schnell einen Bereich von ganzen Zahlen wie diesem zu erzeugen:

%Vor%

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?

    
Alan Turing 01.01.2013, 06:05
quelle

2 Antworten

27

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.

    
R. Martinho Fernandes 01.02.2014 20:16
quelle
0

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:

%Vor%

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.

    
Joe 07.11.2017 10:34
quelle

Tags und Links