2016-07-15 111 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