POWはすでに良い答えを持っています。この回答は、インプレース更新が必要な場合に対処する方法です。
レシピの最初の部分はstd::remove_if
です。これにより、句読点を効率的に削除し、すべての非句読点をそのまま詰めることができます。
std::remove_if (text.begin(), text.end(), ispunct)
残念ながら、std::remove_if
は文字列を新しいサイズに縮小しません。コンテナ自体にアクセスできないため、できません。したがって、パックされた結果の後に文字列に残ったジャンク文字があります。
これを処理するには、std::remove_if
はまだ必要な文字列の部分を示すイテレータを返します。私は私だけでは間違って持って信じることができない - - erase
のためのイテレータは削除する範囲を示す必要がありますこれは、EDIT [
text.erase (std::remove_if (text.begin(), text.end(), ispunct), text.end());
...以下のイディオムにつながる、文字列erase
方法で使用することができます、維持する範囲ではありません。]
これは、多くの状況で機能する一般的なテクニックであるため、これをイディオムと呼びます。string
以外のタイプは適切なerase
メソッドを提供し、std::remove
(と私は今忘れてしまった他のアルゴリズムライブラリ関数かもしれません)は、削除するアイテムのギャップを閉じるが、呼び出し側にコンテナサイズ変更を残すこのアプローチをとっています。
すべての文字を1つずつチェックする必要があります。 –