Est-il possible que l'insertion et/ou l'effacement d'éléments puissent invalider les itérateurs d'éléments existants?Lorsque les itérateurs ptr_vector sont invalidés
Merci.
Est-il possible que l'insertion et/ou l'effacement d'éléments puissent invalider les itérateurs d'éléments existants?Lorsque les itérateurs ptr_vector sont invalidés
Merci.
Oui. Les documentation pour boost::ptr_vector<T>
états:
A
ptr_vector<T>
est un conteneur de pointeur qui utilise unstd::vector<void*>
pour stocker les pointeurs sous-jacents.
et en insérant des éléments en ou effacer des éléments d'un std::vector
peut provoquer réallocation et donc itérateurs existante à invalidée.
Plus précisément, §23.3.6.5/3 11 C++ Unis environ erase()
:
(3) ects E ff: Invalide itérateurs et des références au ou après le point de l'effacement.
et environ insert()
et push_back()
:
(1) Remarques: Causes réallocation si la nouvelle taille est supérieure à l'ancienne capacité. Si aucune réallocation ne se produit, tous les itérateurs et références avant le point d'insertion restent valides.
Par conséquent, pour éviter iterator infirmation dans le cas d'insertion d'éléments, vous pouvez utiliser la fonction reserve()
pour augmenter la capacité du vecteur avant d'obtenir des itérateurs de celui-ci. Ces itérateurs resteront alors valides jusqu'à ce que le size()
du vecteur dépasse le nombre d'éléments pour lesquels l'espace a été réservé.