list, ses itérateurs, les pointeurs sur objet et sa fonction sort
Salut,
Je suis pris d'un doute subit en ce qui concerne la std::list...
Je sais (ou du moins, je crois savoir) que l'insertion ne va pas invalider les pointeurs sur les objets qu'elle contient, et que la suppression ne va invalider que le pointeur sur l'objet supprimé.
Ainsi, normalement, si je prévois un code proche de
Code:
1 2 3 4 5 6 7 8 9 10 11
| std::list<UnType> l;
l.push_back(Untype);
/*... */
UnType * ptr*=&(*(l.begin());
l.push_back(UnType);
/* ptr reste valide
*... */
l.erase(l.rbegin());
/* ptr est toujours valide, pour autant que la suppression n'ai pas
* porté sur l'objet pointé
*/ |
ptr devrait toujours être valide après la seconde insertion, ainsi qu'après l'effacement d'un objet tant que ce n'est pas l'objet pointé.
Mais qu'en est il de la fonction membre sort :question:
Se contente-t-elle de refaire les différentes liaisons entre les itérateurs, sans invalider ptr (selon l'exemple) ou va-t-elle carrément créer des copies des différents objets, ce qui reviendra à ... invalider ptr.
Sur mon système (Gcc 4.5.0), il semblerait que ptr ne soit pas invalidé, mais est-ce le comportement que l'on est réellement en droit d'attendre :question:
Et la question connexe: est-il ne serait-ce qu'intéressant d'envisager l'usage d'un shared_ptr quelconque pour représenter ptr :question: