2016-07-15 8 views
0

私の文字列は!!(!())です。私は文字列から二重の感嘆符を削除したい。文字列でのremove_copyの使用

これは動作しますが、それはこれが上記の行を使用して

remove_copy(str.begin(), str.end(),ostream_iterator<string>(cout), "!!"); 

動作しないすべての叫び声

remove_copy(str.begin(), str.end(),ostream_iterator<char>(cout), '!');//gives (()) 

を削除することが含ま/ C++/5 /ビットは/ usr/

このエラーがスローされます/predefined_ops.h:194:17:エラー:ISO C++はポインタと整数の比較を禁じます[-fpermissive] {return * __ it == _M_value; }

+0

参照は、特に文字列を取る過負荷がないことが明らかです。 – chris

+0

@chris ostream_iteratorは 'template >'を持っています。これは文字列を正しく使用できることを意味しますか? –

+1

@SamidhT stringは文字のリストです。 remove_copyはリストを反復してcharを削除します。それは同様に文字列のリストで動作することができます。 – Balu

答えて

0

remove_copy

OutputIterator remove_copy (InputIterator first, InputIterator last, 
          OutputIterator result, const T& val); 

The function uses operator== to compare the individual elements to val. 

のドキュメントを読んだから、文字列のすべての文字を使用するとvalと比較します。したがって、2番目のケースは機能しません。

私はこのよう

str.erase(str.find("!!"),2); 

それをやってしまった。また、文字列は「!!」を持っていることを確認してくださいそうでなければプログラムのクラッシュ

if(str.find("!!") != string::npos) 
    str.erase(str.find("!!"),2); 
+0

@ user4581301有効なポイント。私は答えを編集しました。 –

+0

あなたの編集したコードは 'find'を2回実行します。これは時間の無駄です。それは次のようにするべきです: 'auto pos = str.find(" !! "); if(pos!= string :: npos)str.erase(pos、2); 'また、文字列に' '!! ''が複数現れた場合はどうなりますか? '' !!! ''があれば?これは、この問題に対する非常に一般的な解決策ではありません。 –

+0

@JonathanWakelyあれば "!!!"それは本当にあなたがそれを扱う方法に依存します(!! 2対!! 1)。それでも、私はまだあなたに同意します、それは一般化されていませんし、効率的でもありません。 –

関連する問題