9
votes

Itérateur C ++ String

J'essaie de faire une instruction IF à l'intérieur d'une boucle avec un itérateur sur une chaîne, mais je ne peux pas comprendre comment obtenir le caractère actuel de l'instruction IF:

for (std::string::iterator i=buffer.end()-1; i>=buffer.begin(); --i) {
    if (!isalpha(*i) && !isdigit(*i)) {
        if(i != "-") { // obviously this is wrong
            buffer.erase(i);
        }
    }
}


1 commentaires

Vous n'avez pas vraiment besoin de la vérification de l'isalpha et d'Isdigit si vous allez vérifier un caractère spécifique juste après


5 Réponses :


20
votes

Je ne peux pas comprendre comment obtenir le caractère actuel p>

Vous le faites deux fois ici: P>

for (std::string::reverse_iterator i = buffer.rbegin(); i != buffer.rend(); ++i)

6 commentaires

si ((* i)! = '-')) au cas où vous auriez besoin de plus de clarification


@ P.R.: Bonne prise sur le "-" .


@James merci :) J'étais un instructeur de laboratoire pour un parcours C ++ et je suppose maintenant les premières choses que mes yeux vont se rendre à '' et ==


Utilisation d'un Reverse_iterator sera plus simple pour l'itération, mais il sera moins simple à effacer éléments.


@David Rodríguez lors de l'utilisation d'un itérateur avant fait Effacer Simple, il rend également la boucle illégale car elle décrémentera l'itérateur avant avant commencer .


@Mark: La boucle est illégale de chaque sens en raison du efface . +1 à vous pour attraper cela et recommander supprimer_if .



2
votes

Pour obtenir le personnage, dis simplement * i , mais cela ne suffit pas. Votre boucle n'est pas légale car elle n'est pas autorisée à décrémenter avant que commence . Vous devez utiliser les itérateurs inverse ou le supprimer_if algorithme.


0 commentaires

1
votes

vous l'avez juste au-dessus dans le précédent si instruction: i est un itérateur, donc * i donne le caractère mentionné par le Itérateur.

Notez que si vous allez itérer à travers une collection à l'envers, il est généralement plus facile d'utiliser un Reverse_iterator avec RBEGIN et Rend . J'utiliserais probablement un algorithme pré-emballé à la place.


0 commentaires

3
votes
if(*i != '-')

0 commentaires

2
votes

D'autres réponses ont résolu le problème particulier que vous avez, mais vous devez savoir qu'il existe différentes approches pour résoudre votre problème réel: effacer des éléments qui remplissent une condition . Qui peut être facilement résolu avec les supprimer / effacer idiom: xxx

tandis que cela pourrait sembler fastidieux au début, une fois que vous l'avez vu quelques fois, il ne l'aura pas plus se surprenant, et c'est un moyen efficace de supprimer des éléments d'un vecteur ou d'une chaîne.

Si votre compilateur n'a pas de support Lambda, vous pouvez créer un foncteur et le transmettre comme troisième argument à < code> supprimer_if : xxx


0 commentaires