2015-08-25 17 views
9

Mi chiedo quali sono i vantaggi dell'utilizzo di rbegin() anziché di end() - 1 per i contenitori STL.Perché utilizzare rbegin() anziché end() - 1?

Per esempio, perché si usare qualcosa come:

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

Piuttosto che:

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

Pensate a '', come 'std :: for_each (v.rbegin(), v.rend(), worker);'. – Nawaz

+0

per qualche ragione hai usato 'auto' nel secondo esempio? – UnKnown

+0

@ UnKnown Solo per digitare meno caratteri. –

risposta

17

rbegin() restituire un iteratore con inversooperator++; cioè, con un reverse_iterator puoi scorrere attraverso un contenitore che va all'indietro.

Esempio:

#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'; 
} 

Inoltre, alcuni contenitori standard come std::forward_list, RITORNO iteratori forward, quindi non si sarebbe in grado di fare l.end()-1.

Infine, se si deve passare l'iteratore ad un algoritmo come std::for_each che presuppone l'utilizzo dello operator++, si è costretti a utilizzare uno reverse_iterator.

+0

Stavo pensando di iterare all'indietro usando itr-- piuttosto che itr ++ per andare al contrario, ma credo che usare la funzionalità integrata abbia più senso. Grazie. –

+0

@VictorBrunell Aggiornamento della mia risposta;) –

+0

Grazie. Questo è molto utile. –

10

Se il contenitore è vuoto, non saranno definiti end() - 1.

+0

Quindi, per un vettore di un elemento, begin() e rbegin() puntano allo stesso elemento? Io vedo. Grazie. –

+3

@VictorBrunell: Sì e no. Gli iteratori di inoltro e gli iteratori inversi non sono compatibili. Non puoi fare 'v.begin() == v.rbegin()'. Ma puoi confrontare gli elementi a cui puntano, ad esempio '& * (v.begin()) == & * (v.rbegin())' è definito e sarà vero per un vettore a 1 elemento. –

+0

Ah, interessante. Grazie. –

Problemi correlati