J'essaie de prendre un vecteur de chaînes et de supprimer chaque personnage qui n'est pas une lettre (nombre, symboles, etc.) Je n'essaie pas non plus d'utiliser des boucles.
Voici un exemple de vecteur: p> et je veux que la chaîne renvoyée ressemble à ceci: p> Jusqu'à présent, j'essaie d'utiliser le Transfrom et effacer les algorithmes, mais je ne peux pas obtenir la syntaxe droite. P> Ceci est évidemment incomplet, mais c'est la configuration de base de ce que j'ai jusqu'à présent: P> int trim(std::vector<std::string> a){
std::transform(a.begin(), a.end(), a.erase())
6 Réponses :
Vous pouvez utiliser std :: for_ach code> a > Sur le vecteur, puis utilisez le Effacer-Supprimer idiom sur le Strings, comme suit
Probablement aucune raison de passer caractère code> comme référence car vous ne le changez pas. Et, si j'étais un éducateur intelligent-a **, je prendrais des marques de faire la boucle de sortie avec
pour code> au lieu d'un autre
pour_ache code> :-) mais ceci est Un peu plus simple que de transformer, alors félicitations pour cela.
Vous pouvez utiliser http://www.cplusplus.com/reference/algorithm/for_each/ " a>
http://www.cplusplus.com/reference/algorithm/transform/ < / p> std :: for_ach code> au lieu de la boucle pour traverser chaque élément.
Ensuite, vous pouvez appliquer
std :: transformer code> sur chaque élément de vecteur. P>
Pourquoi ne montrez-vous pas un extrait de code réel qui résout le problème aussi?
"Vous pouvez utiliser stdd :: for_ach au lieu de boucle" - std :: for_ach code> est i> une boucle en interne.
Voici une façon dont vous pouvez le faire avec l'algorithme code> Algorithme Code> Fonctions en-tête et Lambda: L'externe lambda traite chaque chaîne pour effacer des caractères spécifiques à l'aide de Supprimer_if Code>, tandis que la Lambda intérieure commande simplement quels caractères em> sont supprimés. Que ce soit plus lisible qu'une solution basée sur la boucle est ouverte au débat: -) p> p>
Déplacer la Lambda hors de la transformation et le nommer, pourrait aider la lisibilité. Toujours subjectif bien sûr, mais juste une pensée.
Récursivement ..
#include <iostream> #include <vector> std::string remove_bad_characters(std::string input, std::string result) { if (input.size() == 0) { return result; } if (!isalpha(input[0])) { return remove_bad_characters(input.substr(1), result); } result += input[0]; return remove_bad_characters(input.substr(1), result); } std::vector<std::string> edit_bad_strings(std::vector<std::string> input, std::size_t index) { if (index == input.size()) { return input; } input[index] = remove_bad_characters(input[index], ""); return edit_bad_strings(input, index + 1); } int main() { std::cout<<remove_bad_characters("h!ello!", "")<<"\n"; std::vector<std::string> good = edit_bad_strings(std::vector<std::string>{"h!ell@o", "wo0rl-d"}, 0); for (std::string str : good) { std::cout<<str<<" "; } return 0; }
Vous pouvez utiliser c ++ 20 std :: effacer_if
Vous pouvez l'essayer de différentes manières avec stl
Vous devez spécifier la plage de sortie de
transformer code>. En outre, vous pouvez écrire une lambda qui supprime les non-lettres des cordes.
Vous faites i> réalisez que tout n'utilise
commence () code> et
fin () code> va presque certainement boucler sous les couvertures, oui? Autre que légèrement i> code source plus courte, je ne suis pas sûr de ce que vous gagnerez en évitant les boucles explicites.
@paxdiablo On pourrait faire valoir qu'il transmet une intention plus clairement.
Peut aussi utiliser une récursion je suppose ..
Je ne suis pas autorisé à utiliser des boucles pour cela. Je suppose que l'écriture de la Lambda est ce que j'ai des problèmes.
Si quelqu'un pouvait l'écrire, je l'apprécierais.
Voulez-vous accepter une réponse? Si vous avez besoin de plus de clarification, PLZ, laissez-nous savoir.