POW ha già una buona risposta, se avete bisogno il risultato come una nuova stringa. Questa risposta è come gestirla se si desidera un aggiornamento sul posto.
La prima parte della ricetta è std::remove_if
, che può rimuovere la punteggiatura in modo efficiente, comprimendo tutta la non punteggiatura.
std::remove_if (text.begin(), text.end(), ispunct)
Purtroppo, std::remove_if
non compatta la stringa alla nuova dimensione. Non può perché non ha accesso al contenitore stesso. Pertanto, ci sono caratteri indesiderati rimasti nella stringa dopo il risultato del pacchetto.
Per gestire ciò, std::remove_if
restituisce un iteratore che indica la parte della stringa ancora necessaria. Questo può essere usato con le stringhe erase
metodo, che porta alla seguente idioma ...
text.erase (std::remove_if (text.begin(), text.end(), ispunct), text.end());
[EDIT - Non posso credere che ho appena ricevuto che sbagliato - gli iteratori per erase
dovrebbe indicare l'intervallo per rimuovere , non la gamma da tenere.]
Io chiamo questo un idioma perché è una tecnica comune che funziona in molte situazioni.Altri tipi di string
forniscono i metodi adatti erase
e std::remove
(e probabilmente alcune altre funzioni della libreria di algoritmi che ho dimenticato per il momento) adottano questo approccio per chiudere gli spazi per gli elementi rimossi, ma lasciando il ridimensionamento del contenitore al chiamante.
È necessario controllare tutti i caratteri uno per uno. –