2015-08-25 10 views
9

Ich frage mich, was die Vorteile der Verwendung von rbegin() anstelle von end() - 1 für STL-Container sind.Warum rbegin() anstelle von end() - 1 verwenden?

Zum Beispiel, warum würden Sie so etwas wie:

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

Statt:

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

Denken Sie an '', wie zum Beispiel 'std :: for_each (v.rbegin(), v.rend(), worker);'. – Nawaz

+0

Warum haben Sie im zweiten Beispiel 'auto' verwendet? – UnKnown

+0

@ UnKnown Nur um weniger Zeichen einzugeben. –

Antwort

17

rbegin() einen Iterator mit einer umgekehrtenoperator++ zurückgeben; Das heißt, mit einer reverse_iterator können Sie durch einen rückwärts gehenden Container iterieren.

Beispiel:

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

Darüber hinaus wurden einige Standardcontainer wie std::forward_list, Rückkehr vorwärts Iteratoren, so würden Sie nicht in der Lage sein l.end()-1 zu tun.

Schließlich, wenn Sie Ihren Iterator an einen Algorithmus wie std::for_each übergeben, die die Verwendung der operator++ voraussetzen, müssen Sie eine reverse_iterator verwenden.

+0

Ich dachte daran, rückwärts mit itrr statt itr ++ rückwärts zu gehen, aber die Verwendung der integrierten Funktionalität macht mehr Sinn, denke ich. Vielen Dank. –

+0

@VictorBrunell Meine Antwort aktualisiert;) –

+0

Danke. Das ist sehr hilfreich. –

10

Wenn der Behälter leer ist, end() - 1 nicht definiert werden.

+0

Also zeigen für einen Ein-Element-Vektor begin() und rbegin() auf das gleiche Element? Aha. Vielen Dank. –

+3

@VictorBrunell: Ja und nein. Vorwärts-Iteratoren und Rückwärts-Iteratoren sind nicht kompatibel. Sie können 'v.begin() == v.rbegin()' nicht tun. Aber Sie können die Elemente vergleichen, auf die sie zeigen, d. H. '& * (V.begin()) == & * (v.rbegin())' ist definiert und wird für einen 1-Element-Vektor wahr sein. –

+0

Ah, interessant. Vielen Dank. –

Verwandte Themen