Existe-t-il un moyen de remplacer toutes les occurrences d'une sous-chaîne par une autre chaîne dans std::string
?
Par exemple:
void SomeFunction(std::string& str)
{
str = str.replace("hello", "world"); //< I'm looking for something nice like this
}
Réponses:
Pourquoi ne pas implémenter votre propre remplacement?
la source
Voici la documentation officielle sur replace_all.
la source
replace_all
segfault pour les versions de boost> 1.43 sur Sun Studio pour toute version <12.3boost
augmente considérablement le temps de compilation sur les appareils embarqués. Même quad core ARMv7. 100 lignes de code compilées en 2 minutes, sans boost, 2 secondes.Dans C ++ 11, vous pouvez le faire en tant que ligne unique avec un appel à
regex_replace
:production:
la source
from
peut s'agir d'une expression régulière - vous pouvez donc utiliser des critères de correspondance plus sophistiqués si vous en avez besoin. Ce que je ne vois pas, c'est comment faire cela sans appliquer une forme d'analyse d'expressions régulières - à la place en utilisant uniquement une interprétation directe desfrom
caractères.Pourquoi ne pas renvoyer une chaîne modifiée?
Si vous avez besoin de performances, voici une fonction optimisée qui modifie la chaîne d'entrée, elle ne crée pas de copie de la chaîne:
Tests:
Production:
la source
Mon modèle de recherche et de remplacement sur place en ligne:
Il renvoie un décompte du nombre d'éléments substitués (à utiliser si vous souhaitez exécuter successivement ceci, etc.). Pour l'utiliser:
la source
Le moyen le plus simple (offrant quelque chose qui ressemble à ce que vous avez écrit) est d'utiliser Boost.Regex , en particulier regex_replace .
std :: string a intégré les méthodes find () et replace (), mais elles sont plus lourdes à utiliser car elles nécessitent de traiter les index et les longueurs de chaîne.
la source
Je pense que cela fonctionnerait. Il prend const char * comme paramètre.
la source
size_type
pour une chaîne estunsigned
, votre>=
vérification de la condition de boucle sera toujourstrue
. Vous devez l'utiliserstd::string::npos
là-bas.roll_down_window
la source
Il est important de vérifier que oldStr est vide. Si pour une raison quelconque ce paramètre est vide, vous serez coincé dans une boucle infinie.
Mais oui, utilisez la solution éprouvée C ++ 11 ou Boost si vous le pouvez.
la source