2016-05-12 2 views
3

std::stringにあるすべての'0'を後ろから削除しようとしています。 thisによれば、逆方向イテレータには複数の方法があります。.erase文字列の消去により要素が後方イテレータで付加されます

奇妙なことは、それらがすべて消去する代わりに、std::stringに数字を追加することです!ここ

)は少しサンプル

//'str' will be "5.090000" 
std::string str = std::to_string(5.09); 

auto it = std::remove_if(str.rbegin(), str.rend(), [](char value) { 
    return value == '0'; 
}); 

1プリC++11方法:

str.erase(--(it.base())); 

2)C++11方法(1)

str.erase(std::next(it).base()); 

3)C++11方法(2 )

std::advance(it, 1); 
str.erase(it.base()); 

すべての場合、str == "5.095.9"。どうして? 5.09 | 5.9、最初の値:私はそれを見るように、str5.9する必要がありますので、それはない...

私の最高の推測では、私はあなたが文字列を分割する場合ので、後方のイテレータと間違って何かをやっているということですその間にはまだ'0'がありますが、最後のものはありません。 2番目の値は実際には私が期待したstd::stringです。

私は間違っていますか?

+2

ルック::非常に慎重にremove_if'、あなたが操作している範囲について考えます。 –

+0

逆イテレータは一度も使用していませんでしたが、私の推測によれば、次のように使用する必要があります: 'std :: remove_if(str.rend()、str.rbegin()、[](char value)' – user463035818

+0

@KerrekSB私は彼にrtfmの運動を台無しにしたのですか? – user463035818

答えて

1

私は私のアプローチで2つのエラーをした:1つだけイテレータと呼ば

  • eraseはないイテレータから最後まで、反復子が指している要素を削除し(私は誤って想定される)
-

のでstr.erase(std::next(it).base(), str.end());が、これはまだ間違っている、読書を続ける; @KerrekSBが指摘したように、私は読んでいない

  • the docs慎重に:std::reverse_iteratorを使用しているため、要素はのフロントにプッシュバックされます。したがって、itが新しいエンドイテレータ(つまり、の前にBTW である)を指しているので、先頭から(str.begin())からit.base()までの範囲を削除する必要があります。


TL; DR

新しい作業バージョンがある:STD `のドキュメントをstr.erase(str.begin(), it.base());

関連する問題