2013-01-01 40 views
8

Jaka jest różnica między irange i counting_range?Różnica między wartością asymetrii i counting_range w trybie zwiększenia

Potrzebowałem irange szybko generować szereg liczb takiego:

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

Ale zauważyłem przykład gdzieś (utracone link), który mówi o counting_range zamiast wykonać to samo zadanie. Czy istnieje proste wyjaśnienie różnicy między tymi dwoma?

+2

To był niesamowicie scarisome przykład tego, jak dezinformacja może być prezentowana jako autorytatywny i recenzowany fakt, na SO. –

Odpowiedz

27

Główna różnica polega na tym, że irange to zakres dostępu losowego, podczas gdy counting_range nie jest. counting_range jest oparty na Boost.Iterator's counting_iterator, który bezpośrednio wykorzystuje wszystkie operacje liczb całkowitych. Liczby całkowite w C++ prawie pasują do koncepcji iteratora: jedyne czego brakuje to operator*. counting_iterator zapewnia operator* jako operację tożsamości i przekazuje wszystko inne do odpowiedniego typu.

Inną różnicą jest to, że irange obsługuje także różne przyrosty niż 1.

Żaden z nich nie materializacji cały zakres liczb całkowitych iteracyjne się skończy, więc zastosowanie zarówno O (1) pamięci.

0

Zarówno modele irange, jak i counting_range modelują zakres dostępu losowego dla typów całkowitych. Jako counting_range s Dokumentacja wskazuje jej kategorii iteracyjnej określa się zgodnie z następującym algorytmem:

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&) 

Dlatego prostych zakresach, takich jak boost::irange(0, 10) i boost::counting_range(0, 10) jest skutecznie różnicy (oprócz rodzajów każdym przedziale, z kierunek!).

Jednakże irange obsługuje iteracji o różnej wielkości kroku, na przykład, boost::irange(0, 10, 2) i counting_range obsługuje typów, które są tylko incrementable i nie w pełni AN całkowitą.