2013-01-01 7 views
8

Qual è la differenza tra irange e counting_range?Differenza tra irange e counting_range in Boost

avevo bisogno irange per generare rapidamente una serie di numeri interi in questo modo:

auto example = boost::irange(0, 5); /// result is {0, 1, 2, 3, 4} 

ma ho notato un esempio da qualche parte (perso il link) che parla invece su counting_range per eseguire la stessa operazione. C'è una semplice spiegazione della differenza tra questi due?

+2

Questo è stato un esempio incredibilmente scarisabile di come la disinformazione possa essere presentata come fatto autorevole e sottoposto a peer review, su SO. –

risposta

27

La differenza principale è che irange è un intervallo di accesso casuale mentre non lo è counting_range. counting_range si basa su counting_iterator di Boost.Iterator che utilizza direttamente tutte le operazioni di interi sottostanti. Gli interi in C++ si adattano quasi al concetto di iteratore: l'unica cosa che manca è uno operator*. counting_iterator fornisce un operator* come operazione di identità e inoltra tutto il resto al tipo sottostante.

Un'altra differenza è che irange supporta anche diversi incrementi di 1.

Nessuno di loro ha mai materializza l'intera gamma di interi che iterano sopra, in modo che sia per uso O (1) di memoria.

0

Entrambe irange e counting_range modellano un intervallo di accesso casuale per i tipi interi. Come sottolinea counting_range s documentazione, la categoria iteratore viene determinata secondo il seguente algoritmo:

if (CategoryOrTraversal is not use_default) 
    return CategoryOrTraversal 
else if (numeric_limits<Incrementable>::is_specialized) 
    return iterator-category(random_access_traversal_tag, Incrementable, const Incrementable&) 
else 
    return iterator-category(iterator_traversal<Incrementable>::type, Incrementable, const Incrementable&) 

Pertanto, per semplici intervalli come boost::irange(0, 10) e boost::counting_range(0, 10) v'è effettivamente alcuna differenza (a parte i tipi di ogni intervallo, di corso!).

Tuttavia, irange supporta anche iterazione con un passo diverso, ad esempio, boost::irange(0, 10, 2) e counting_range supporta anche tipi che sono incrementabile solo e non modellano completamente un numero intero.