2015-08-25 28 views
9

Zastanawiam się, jakie korzyści płyną z używania rbegin() zamiast end() - 1 dla kontenerów STL.Dlaczego warto używać funkcji rbegin() zamiast końcówki() - 1?

Na przykład, dlaczego byłoby użyć coś takiego:

vector<int> v; 
v.push_back(999); 
vector<int>::reverse_iterator r = v.rbegin(); 
vector<int>::iterator i = r.base(); 

zamiast:

vector<int> v; 
v.push_back(999); 
auto r = v.end() - 1; 
+2

Pomyśl o '', na przykład 'std :: for_each (v.rbegin(), v.rend(), worker);'. – Nawaz

+0

z jakiego powodu użyłeś 'auto' w drugim przykładzie? – UnKnown

+0

@ Nieznany Wystarczy wpisać mniej znaków. –

Odpowiedz

17

rbegin() return iterator z do tyłuoperator++; to znaczy, że z reverse_iterator możesz dokonać iteracji przez pojemnik do tyłu.

Przykład:

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> v{0,1,2,3,4}; 
    for(auto i = v.rbegin(); i != v.rend(); ++i) 
     std::cout << *i << '\n'; 
} 

Ponadto niektóre standardowe kontenery jak std::forward_list powróć iteratory forward, więc nie będzie w stanie zrobić l.end()-1.

Wreszcie, jeśli musisz przekazać swój iterator do jakiegoś algorytmu, takiego jak std::for_each, który zakłada użycie operator++, jesteś zmuszony użyć reverse_iterator.

+0

Myślałem o iteracji wstecz za pomocą itr - zamiast itr ++, aby przejść do tyłu, ale korzystanie z wbudowanej funkcjonalności wydaje się bardziej sensowne. Dzięki. –

+0

@VictorBrunell Zaktualizowano moją odpowiedź;) –

+0

Dzięki. To bardzo pomocne. –

10

Jeśli pojemnik jest pusty, end() - 1 nie zostaną zdefiniowane.

+0

Tak więc, dla wektora jednego elementu, begin() i rbegin() wskazują na ten sam element? Widzę. Dzięki. –

+3

@VictorBrunell: Tak i nie. Forward iteratory i odwrotne iteratory nie są kompatybilne. Nie możesz wykonać 'v.begin() == v.rbegin()'. Ale możesz porównać elementy, na które wskazują, tj. '& * (V.begin()) == & * (v.rbegin())' jest zdefiniowane i będzie prawdziwe dla wektora 1-elementowego. –

+0

Ah, interesujące. Dzięki. –

Powiązane problemy