0
votes

Boucle jusqu'à ce que l'un des éléments d'un std :: vecteur n'est pas rencontré

Je traverse un analyseur de base pour le code C ++ qui extrait des informations sur les classes du code d'entrée. Pour cela, j'ai une méthode qui recherche des membres de données à partir d'une position d'itérateur jusqu'à ce qu'elle rencontre certaines cordes telles que "publique", "protégée", "};". Les chaînes sont transmises dans un vecteur car je dois également utiliser la fonction pour d'autres points d'arrêt et que le nombre de cordes ne peut pas être corrigé. Comment puis-je obtenir les éléments d'un vecteur à l'intérieur de la condition d'une boucle lorsque je ne sais pas à l'indice d'arrêt? Il ressemble à quelque chose comme ceci: xxx

où la valeur finale pourrait être n'importe quoi.

est-ce possible? J'espère que j'ai bien expliqué ma requête bien. J'utilise des itérateurs dans le code. Abscriptions utilisées uniquement pour expliquer ma requête.

Merci!


8 commentaires

std :: Trouver Votre ami est votre ami.


std :: vecteur :: taille () ?


@Zivs a pensé à ce sujet mais encore une fois, je devrais faire itération à travers le vecteur à l'intérieur de la condition de boucle.


Pourquoi Devez-vous itérus sur le vecteur? Peut-être avez-vous besoin std :: Rechercher au lieu de std :: Trouver ? Quel est le problème réel vous devez résoudre? Quelle est la raison derrière la boucle?


@Some programmateur mec j'ai mis à jour la question.


Vous savez que votre condition pendant ne doit pas nécessairement être des comparaisons simples, non? C'est juste une expression booléenne. Qui peut toujours être un appel de fonction qui retourne bool , où vous transmettez une référence au vecteur et la valeur, et que la valeur C ++ entièrement indépendante iTère sur le vecteur et vérifiez s'il contient une valeur et retourne vrai ou faux, selon que la valeur existe dans le vecteur.


obtenu la solution. Merci beaucoup tout le monde.


@Hassaan Lorsque vous arrivez à une solution qui n'était pas dans une réponse, vous devriez écrire une réponse et nous dire quelle était cette solution. Juste dire "obtenu la solution" n'aide personne .


3 Réponses :


0
votes

S'il est vérifiant qu'un élément n'existe pas entre un Démarrer CODE> Position et une position Code> Terminer Code>, vous pouvez utiliser:

bool not_present(size_t start, size_t finish, value_type value, const ContainerType& vect)
{
    for (size_t i = start; i <= finish; ++i)
    {
        if (value == vect[i]) return false;
    }
    return true;
}


8 commentaires

Pourquoi n'utiliseriez-vous pas trouver pour cela?


@LighessRacesinorbit OP a un index dans un vecteur pour une position de finition (j'ai généralisé une position de départ), semblait donc plus simple de procéder de cette façon


std :: Recherche (Vec.begin (), Vec.begin () + N, valeur) == Vec.end () ?


Votre version utilise également une plage entièrement fermée qui n'est pas idiomatique!


@LightnessRacesinorbit L'OP utilise des gammes entièrement fermées.


Je réalise que, mais le même commentaire à eux: P Une fonction réutilisable comme celle-ci ne devrait pas


@LightnessSracacesinorbit Bien sûr et utiliser toutes les capuchons d'un nom de variable est loin d'être acceptable dans le code de qualité industrielle, mais donné que nous traitons avec l'enseignement du concept fondamental de la réduction de l'effondrement N dans une boucle que je pensais que de petites étapes ont été jugées préférable.


Ne pas entièrement en désaccord. Juste noter!



1
votes

Dans les commentaires, vous êtes inquiet "Je devrais faire itérair le vecteur à l'intérieur de la condition de boucle", mais toute implémentation em> devra passer par chaque élément pour vérifier qu'il peut continuer.

Votre condition de boucle peut être exprimée comme «Arrêtez-vous si nous trouvons a code> dans vect code>", et nous pouvons voir qu'il y a une belle std :: Trouver code> déjà dans code> . std :: Recherche code> renvoie un itérateur pointant sur l'endroit où il a trouvé l'élément, ou fin code> s'il ne l'a pas trouvé. P>

while(std::find(vect.begin(), vect.end(), a) == vect.end()) {
    //loop body
}


0 commentaires

0
votes

La solution était assez simple cependant. Mon esprit était juste coincé à "itérer à travers le vecteur dans la condition de boucle" qui était le coupable.

C'est ce que j'ai fait: xxx


0 commentaires