0
votes

Modifier les chaînes dans un vecteur? (Sans utiliser des boucles)

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> xxx pré>

et je veux que la chaîne renvoyée ressemble à ceci: p> xxx pré>

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())


7 commentaires

Vous devez spécifier la plage de sortie de transformer . En outre, vous pouvez écrire une lambda qui supprime les non-lettres des cordes.


Vous faites réalisez que tout n'utilise commence () et fin () va presque certainement boucler sous les couvertures, oui? Autre que légèrement 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.


6 Réponses :


3
votes

Vous pouvez utiliser std :: for_ach Sur le vecteur, puis utilisez le Effacer-Supprimer idiom sur le Strings, comme suit xxx


1 commentaires

Probablement aucune raison de passer caractère 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 au lieu d'un autre pour_ache :-) mais ceci est Un peu plus simple que de transformer, alors félicitations pour cela.



0
votes

Vous pouvez utiliser std :: for_ach au lieu de la boucle pour traverser chaque élément. Ensuite, vous pouvez appliquer std :: transformer sur chaque élément de vecteur.

vous pouvez vous référer -

http://www.cplusplus.com/reference/algorithm/for_each/ http://www.cplusplus.com/reference/algorithm/transform/ < / p>


2 commentaires

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 est une boucle en interne.



0
votes

Voici une façon dont vous pouvez le faire avec l'algorithme Algorithme Fonctions en-tête et Lambda: xxx

L'externe lambda traite chaque chaîne pour effacer des caractères spécifiques à l'aide de Supprimer_if , tandis que la Lambda intérieure commande simplement quels caractères sont supprimés. Que ce soit plus lisible qu'une solution basée sur la boucle est ouverte au débat: -)


1 commentaires

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.



1
votes

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;
}


0 commentaires

0
votes

Vous pouvez utiliser c ++ 20 std :: effacer_if xxx


0 commentaires

0
votes

Vous pouvez l'essayer de différentes manières avec stl S, j'ai implémenté un foncteur pour traiter chaque mot: xxx


0 commentaires