2016-07-15 19 views
1

Ich versuche, eine std::string rückwärts mit Iteratoren wie folgt zu drucken:C++ Wie wird eine Zeichenfolge rückwärts gedruckt?

std::string back = "hello"; 
for(std::string::iterator it=back.end(); it!=back.begin(); --it) 
{ 
    std::cout << (*it); 
} 

Aber der Ausgang wird nur ausdrucken:

olle 

Warum ist es nicht auch die h ausdrucken? Ich habe ein paar verschiedene Dinge ausprobiert und damit herumgespielt, aber ich kann einfach nicht herausfinden, warum. Jede Hilfe wäre sehr dankbar, danke !! :)

+2

Das Problem ist, das 'back.end()' zeigt * hinter * den String und nicht beim letzten Element. Haben Sie http://en.cppreference.com/w/cpp/iterator/reverse_iterator versucht? – pingul

+1

Warum nicht 'std :: reverse()' verwenden? –

+0

'it> = back.begin()' – GreatAndPowerfulOz

Antwort

13
std::string back = "hello"; 
for (std::string::reverse_iterator it = back.rbegin(); it != back.rend(); ++it) 
{ 
    std::cout << (*it); 
} 
+0

Ich werde Reverse-Iteratoren jetzt, dass ich weiß, dass sie existieren. Vielen Dank! :) – ocean800

6
std::string::iterator it=back.end(); 

it wird auf end() initialisiert. Dann Innenseite der Schleife:

std::cout << (*it); 

Da der Anfangswert von it ist end(), Dereferenzieren es undefiniertes Verhalten ist, mit unvorhersehbaren Ergebnissen.

Der richtige Ansatz ist itvor zu vermindern, dereferenziert wird:

for(std::string::iterator it=back.end(); it!=back.begin();) 
{ 
    --it; 
    std::cout << (*it); 
} 
+0

Beat mich dazu. Ich würde jedoch auch umgekehrte Iteratoren vorschlagen. –

+0

Ahhhh ich sehe. Danke für die Erklärung, wo ich falsch gelaufen bin. Ich glaube, ich werde Reverse-Iteratoren für diese verwenden, aber jetzt, da ich weiß, dass sie existieren :) – ocean800

5

Wenn Sie nicht wollen, eine for-Schleife:

#include <algorithm> 

std::string string_back = "hello"; 
std::reverse(string_back.begin(), string_back.end()); 
std::cout << string_back; // prints 'olleh' 
+0

In meinem Fall, ich möchte speziell einen Iterator, weil ich einige Transformation auf jedem 'char' mache, aber ich werde dies beachten :) – ocean800

+0

Ah, ich verstehe. Berücksichtigen Sie in zukünftigen Fällen mein Antwortwissen für Sie. – peterkshultz

Verwandte Themen