2013-05-17 10 views
6

Pętla C++ 11 dla pętli odejmuje iterator. Czy to oznacza, że ​​nie ma sensu używać go z boost::adaptor::indexed? Przykład:Oparte na zakresie pętli z boost :: adapter :: indeksowane

boost::counting_range numbers(10,20); 
for(auto i : numbers | indexed(0)) { 
    cout << "number = " i 
    /* << " | index = " << i.index() */ // i is an integer! 
    << "\n"; 
} 

Zawsze mogę użyć licznika, ale lubię indeksowane iteratory.

  • Czy można z nich korzystać w jakiś sposób w oparciu o pętle?
  • Jaki jest idiom używania pętli opartych na zakresie z indeksem? (tylko zwykły licznik?)
+1

'indexed' zasysa ponieważ dodaje' indeks() 'metodę do iteracyjnej * *, a nie wartość zwróconą dereferencing iteracyjnej. :/ – Xeo

+1

@Xeo Rzeczywiście. Od czasu do czasu potrzebuję indeksu elementu w zakresie. Najpierw źle się z tym czuję. Następnie wprowadzam licznik. Jeśli można łatwo uzyskać dostęp do kontenera za pomocą zwykłej starej pętli, znowu czuję się źle i przepisuję pętlę bazującą na zwykłą pętlę. – gnzlbg

+2

, ponieważ wspomniany indeks przyspieszenia Xeo nie jest do tego odpowiedni. Jeśli nie masz nic przeciwko przełączaniu bibliotek to kilka bibliotek klasy C++ opartych na itertoolach Pythona, takich jak: https://github.com/ryanhaining/cppitertools/ – Cechner

Odpowiedz

2

Zostało to naprawione w wersji Boost 1.56 (wydanej w sierpniu 2014 r.); element jest pośredni za funkcjami składowymi value_type z z .

przykład: http://coliru.stacked-crooked.com/a/e95bdff0a9d371ea

auto numbers = boost::counting_range(10, 20); 
for (auto i : numbers | boost::adaptors::indexed()) 
    std::cout << "number = " << i.value() 
     << " | index = " << i.index() << "\n"; 
0

Krótka odpowiedź (jak wszyscy w komentarzach) jest "właściwa, nie ma sensu". Też znalazłem to denerwujące. W zależności od Twojego stylu programowania, można jak „zipfor” pakiet napisałem (tylko nagłówek): from github

To pozwala składnia jak

std::vector v; 
zipfor(x,i eachin v, icounter) { 
    // use x as deferenced element of x 
    // and i as index 
} 

Niestety, nie mogę zrozumieć drogę do korzystania z wahała opartej dla składni i muszą uciekać się do „zipfor” makro :(

nagłówek został pierwotnie zaprojektowany dla rzeczy jak

std::vector v,w; 
zipfor(x,y eachin v,w) { 
    // x is element of v 
    // y is element of w (both iterated in parallel) 
} 

i

std::map m; 
mapfor(k,v eachin m) 
    // k is key and v is value of pair in m 

Moje testy na g ++ 4.8 z pełnymi optymalizacjami pokazują, że wynikowy kod nie jest wolniejszy niż zapisanie go ręcznie.

Powiązane problemy