Contrôle de flux avec les itérateurs

0

La question

Dire que j'ai quelque chose comme ceci:

void myFunk(std::vector<T>& v, std::vector<T>::iterator first, std::vector<T>::iterator last) {
    while (first != last) {
        if ((*first) > (*last)) {
            T someT;
            v.push_back(someT);
        }
        first++;
    }
}

int main(){
    std::vector<T> foo = {some, T, values};
    myFunky(foo, foo.begin(), foo.end())
    return 0;
}

Serait-il conduire à une boucle infinie, ou serait-ce la fin après foo.size() itérations? En d'autres termes, l' last itérateur être mis à jour aussi foo a grandi, ou serait-il conserver la valeur indiquée dans l'appel de fonction?

Je suis en supposant que last pouvait changer, puisque c'est un pointeur vers une position, mais voudrais une confirmation.

c++ controls flow iterator
2021-11-18 16:56:38
1

La meilleure réponse

0

Serait-il conduire à une boucle infinie, ou serait-ce la fin après foo.size() itérations?

Ni. Ce que vous faites est un comportement indéfini, pour un couple de raisons:

  • Vous êtes en train de modifier la vector lors de l'itération à travers elle.

    Si le vecteur de réallouer son stockage interne lorsque l'on pousse un nouvel élément, tous les itérateurs dans le vector sont invalidés, y compris les deux itérateurs vous êtes en utilisant pour faire une boucle avec. Mais même juste en poussant un nouvel élément toujours invalide la end() itérateur, au moins.

    Voir Itérateur invalidation des règles pour le C++ conteneurs

  • Vous êtes à la référence à la end() itérateur, qui n'a jamais fait référence à un élément valide.

Je suis en supposant que last pouvait changer, puisque c'est un pointeur vers une position

Il ne peut pas changer, puisque vous avez passé dans le myFunc fonction par valeur, donc c'est une copie de l'original end() itérateur. Si end() les changements de valeur, last pas de changement de valeur, puisque c'est une copie.

Dans tous les cas, les itérateurs sont pas nécessairement mis en œuvre comme des pointeurs, mais les pointeurs sont valables les itérateurs. Mais il n'a pas d'importance dans ce cas. Même si vector::iterator ont été qu'un simple pointeur, last serait encore invalidé lors de chaque pression ou de réaffectation.

2021-11-18 21:20:33

Passage par valeur a été délibéré - l'idée était d' essayer de faire le vecteur d'itération dans les valeurs actuelles, tout en ajoutant de nouvelles à la fin. Sens que j'ai été l'obtention de la mémoire des violations d'accès au moment de l'exécution. Merci pour l'invalidation des règles de la fiche (je savais ce que je cherchais a été documenté, mais ne savais pas comment verbaliser). Et merci pour la réponse de l'homme. Vraiment clarifier les choses. Cheers!
Pedro Barbeira

Je suggère la mise en cache de l'insère à un vecteur, puis ajouter à la fin de la cible vecteur après l'itération est terminée.
Remy Lebeau

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................