2016-07-15 14 views
1

は、私はこのようなイテレータとの下位std::stringを印刷しようとしている:C++文字列を後方に印刷するには?

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

しかし、出力のみ出力します:なぜそれはまた時間をプリントアウトされていない

olle 

?私はいくつかのことを試してみましたが、その理由を理解することはできません。どんな助けでも大変感謝します。ありがとう!! :)

+2

問題がある

正しいアプローチは、それが逆参照を取得します前itを減少することです'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(); 

itend()に初期化されます。次に、ループの内側:

std::cout << (*it); 

itの初期値は、それが予期せぬ結果と、未定義の動作である間接参照、end()であるので。

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

私にそれを打つ。しかし、私は逆イテレータを提案するつもりでした。 –

+0

私はAhhhh参照してください。私が間違っていた場所の説明に感謝します。私は、逆のイテレータを使用すると信じていますが、今は存在することを知っています:) – ocean800

5

あなたがループしたくない場合は::

#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

関連する問題