Comment enlever efficacement les guillemets de std::string, si elles existent
Cette question risque d'être un doublon par exemple supprimer les guillemets doubles à partir d'une chaîne de caractères en c++
mais aucun des asnwers que j'ai vu adresses ma question
J'ai une liste de chaînes de caractères, certaines sont entre guillemets doubles et certains ne le sont pas, les Citations sont toujours au début et à la fin
std::vector<std::string> words = boost::assign::list_of("words")( "\"some\"")( "of which")( "\"might\"")("be quoted");
Je suis à la recherche de la façon la plus efficace pour supprimer les guillemets. Voici ma tentative
for(std::vector<std::string>::iterator pos = words.begin(); pos != words.end(); ++pos)
{
boost::algorithm::replace_first(*pos, "\"", "");
boost::algorithm::replace_last(*pos, "\"", "");
cout << *pos << endl;
}
Je peux faire mieux que cela? J'ai potentiellement des centaines de milliers de chaîne de processus.Ils peuvent venir à partir d'un fichier ou d'une base de données. Le std::vector dans l'exemple, c'est juste pour des fins d'illustration.
si seulement nous pouvions choisir les données que nous avons à travailler avec 🙂
Combien de temps sont les chaînes de caractères?
Parfois, nous le pouvons. Parfois, nous de la source de données et tentent de corriger la mauvaise chose.
Je doute qu'il serait imposer bizarre, les restrictions et les exigences sur lui-même, s'il avait le choix.
OriginalL'auteur molita | 2011-09-11
Vous devez vous connecter pour publier un commentaire.
Il serait probablement rapide pour faire une vérification:
Il pourrait ne pas être la plus belle chose jamais, mais il est O(n) avec une petite constante.
ce que vous ne comprenez pas? Voici les paroles: Si le premier caractère est un " puis: si le dernier caractère est un ", hacher la première et la dernière personnages, d'autre hacher le premier caractère off. Autre chose, si le dernier caractère est un ", hacher le dernier caractère off.
En fait maintenant je pense que je fais. Au départ, j'ai vu des tas de *s et de la pensée que vous faisiez brut de l'arithmétique des pointeurs que je n'ai pas tout à fait comprendre, mais vous êtes un déréférencement les itérateurs, maintenant, il fait sens.
Si vous avez du C++11, vous pouvez modifier le laid
*(i->begin())
et*(i->rbegin())
ài->front()
eti->back()
. Beaucoup plus lisible.Vous avez un problème si votre chaîne est un char, long et c'est un
"
OriginalL'auteur Seth Carnegie
Si vous connaissez les citations qui apparaissent toujours dans la première et la dernière position, vous pouvez le faire simplement
La complexité est encore linéaire en la taille de la chaîne. Vous ne pouvez pas insérer ou retirer le début d'une
std::string
en O(1) fois. Si elle est acceptable pour remplacer un caractère par un espace, puis le faire.C'est ce que les "si" ne. Nous n'avons pas vraiment une description du problème ici, de toute façon. Qu'en est échappé de devis dans la chaîne? Qui sait?
oups, mes yeux ont sauté sur l'
if
attendu pour être lefor
qui parcourt le vecteur, désolé. Arrive tout le temps à moi. Et ouais, le problème est mal spécifié.Cela ressemble élégant et aimple le problème est que je peut effacer un non citation à la fin s'il arrive qu'une chaîne a cite seulement au début ( en cas de mauvais de données )
Je considère cette réponse mieux que Seth est parce que c'est plus simple et moins coûteux d'allocation. Plus précisément, Seth est toujours attribuer une nouvelle chaîne de la substr appel, tandis que le
s.erase(0,1)
dans cette un copie les personnages en place. Les.erase(s.size()-1)
serait un peu plus lisibles.pop_back()
, et est à peu près deux affectations, et c'est probablement négligeable.OriginalL'auteur Potatoswatter
C'est la façon dont je l'approche de la situation:
std::vector<std::string>
en premier lieu. Si vous êtes simplement recevoir unstd::vector<std::string>
il n'y en a pas beaucoup que vous pouvez faire que le retrait de la première citation exigera copier le reste de la chaîne.OriginalL'auteur uesp