A deque
est un objet. C'est un conteneur, donc il contient autres objets dans son stockage interne. Ce sont des éléments stockés dans un deque
.
Vous pouvez accéder à ces éléments. Accéder à un élément revient à obtenir une référence à partir du conteneur. Si vous le cochez, toutes les méthodes de la section element access renvoient un type reference
.
Vous pouvez effectuer une copie de l'élément accédé, mais vous pouvez stocker la référence elle-même. T foo = d.front();
contre T& bar = d.front();
. (Let d
être un peu std::deque<T>
)
Une référence à un deque serait auto& ref_d = &d;
. C'est autre chose.
Alors:
1. Quel effet « insérer » ont des références à Deques?
Aucune. les références à d
vont bien.
2. Qu'est-ce que cela signifie?
Un deque est conçu de telle manière que insertion au début ou à la fin de celui-ci ne remet pas en cause les références aux éléments que vous pourriez avoir déjà stockés. Bien que si vous insérez au milieu, les éléments peuvent se déplacer en mémoire. Notez que le bar
n'est pas touché. Précisément parce qu'il ne peut pas l'être, il est invalidé. La référence (ou l'itérateur) précédemment obtenue n'indique plus rien de significatif, donc le déréférencement est illégal.
3. Est-ce que cela signifie que les références à la table elle-même sont invalidées?
Nope, comme dans 1.
4. ou les références à ses éléments [sont invalidés]?
Oui, comme dans 2.
5. ou les références aux itérateurs [sont invalidées]?
Vous semblez à nouveau confondre quoi quoi. Une référence à un itérateur serait std::deque<T>::iterator& iter_ref;
, si vous obtenez un itérateur d'un deque
. Par exemple. auto iter = d.begin();
et faire une référence à iter_ref = &iter;
, un insert
ne fait pas *iter_ref
illégale, il invalide l'itérateur, donc *iter
est illégale (ou **ref_iter
). Remarque: Je ne dis pas que quelque chose comme std::deque<T>& ref_d
ou std::deque<T>::iterator& iter_ref
a un sens, mais c'est une signification sémantique de "référence à un deque" et "référence à un interacteur".
Références aux éléments. –
@BaummitAugen Comment est-ce possible? Les références C++ ne peuvent pas être modifiées une fois qu'elles ont été attribuées. – Dovahkiin
[Relié] (https://stackoverflow.com/questions/913980/confusion-on-iterators-invalidation-in-deque) –