2016-07-15 118 views
1

我試圖用這樣的迭代器向後打印std::stringC++如何向後打印字符串?

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

但產量將只打印出來:

olle 

爲什麼不還打印出的H?我嘗試了幾個不同的東西,並玩弄它,但我似乎無法弄清楚爲什麼。任何幫助將不勝感激,謝謝! :)

+2

的問題是back.end()'指向*字符串後面,而不是最後一個元素。你有沒有試過http://en.cppreference.com/w/cpp/iterator/reverse_iterator? – pingul

+1

爲什麼不使用'std :: reverse()'? –

+0

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

回答

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

現在我將使用反向迭代器,我知道它們存在。謝謝! :) – ocean800

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

it初始化爲end()。然後,在循環的內部:

std::cout << (*it); 

由於it初始值是end(),解除引用它是未定義的行爲,以不可預知的結果。

正確的做法是遞減it之前它得到解除引用:

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

擊敗我。但是,我也會建議反向迭代器。 –

+0

Ahhhh我明白了。感謝您解釋我出錯的地方。我相信我會爲此使用反向迭代器,但現在我知道它們存在:) – ocean800

5

如果你不想一個for循環:

#include <algorithm> 

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

在我的情況下,我特別想要一個迭代器,因爲我正在對每個'char'進行一些轉換,但我會牢記這一點:) – ocean800

+0

啊,我明白了。在未來的案例中考慮我的答案知識。 – peterkshultz