2016-11-11 8 views
1

有する物体reverse_iterator挙動は[]

// #1 Outputs NOTHING, expected "jihgfedcba" 
for (auto begin = std::rbegin(a), end = std::rend(a); begin != end; ++begin) 
    std::cout << *begin; 
std::cout << std::endl; 
// #2 Outputs "jihgfedcba", as expected 
for (auto begin = std::rbegin(s), end = std::rend(s); begin != end; ++begin) 
    std::cout << *begin; 
std::cout << std::endl; 

しかし、文字出力のアレイを印刷文字列の出力中に期待される出力が表示されません。

文字配列の印刷は、文字列の印刷にも影響します。#2ループの前に#1ループが書き込まれた場合、プログラムは何も出力せず、順序を逆にします。jihgfedcbaが表示されます。


私はstd::rbegin(a)修正問題の戻り値を微調整することに気づい:

// Outputs "jihgfedcba", as expected 
// notice the ++!! 
for (auto begin = ++std::rbegin(a), end = std::rend(a); begin != end; ++begin) 
    std::cout << *begin; 
std::cout << std::endl; 

// Outputs "jihgfedcba", as expected 
for (auto begin = std::rbegin(s), end = std::rend(s); begin != end; ++begin) 
    std::cout << *begin; 
std::cout << std::endl; 

ですが、なぜでしょうか?

+0

私は再現できません。両方のループは私にとって同じ結果を生み出します。 const char []の場合を除いて、余分な空白が前面に印刷されています( '\ 0')。 – DeiDei

+0

@DeiDeiは、記述された動作を示す[code](http://melpon.org/wandbox/permlink/k1RqUEKvVRxedJVf)を提供します。 –

答えて

1

charのアレイが含まれている:

{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', '\0'} // 11 characters 

std::stringを含むが:最初のケースで

"abcdefghij" // 10 characters 

を、(最初のループで)最後の文字が '\ 0' です。ループを "微調整"すると、この文字はスキップされます。

あなたの行動を再現することができない場合でも、これが問題の原因になると思います。

+0

* issue *の一部について説明します。しかし、なぜ 'char'の配列を表示(調整せずに)するとコンソールに出力されないのか説明していません。 –

+0

私はそれを再現できません。私の場合は、調整しなくても両方とも正しく印刷されます。どのコンソールを使用しますか? –

+0

この動作は、最後のgccコンパイラとclangコンパイラを使って[Wandboxコンソール](http://melpon.org/wandbox/permlink/k1RqUEKvVRxedJVf)で観察されました。 –