Envisagez le programme suivant. Il crée un ensemble de pointeurs sur les valeurs et utilise un comparateur indrect_less personnalisé qui trie l'ensemble par la valeur de l'entier pointé. Une fois cela fait, je change ensuite la valeur de l'un des entiers pointés. Ensuite, on peut voir que l'ordre de l'ensemble n'est plus trié (je suppose que l'ensemble ne sait pas que quelque chose a changé).Invalidation d'un ensemble de pointeurs via l'indirection
(Ne prêtez pas attention C++ 0x boucles, je suis en cours d'exécution sur VS2010)
#include <iostream>
#include <set>
using namespace std;
struct indirect_less {
bool operator()(int* l, int* r) const
{
return *l < *r;
}
};
int main()
{
set<int*, indirect_less> myset;
int* a = new int(5);
int* b = new int(6);
int* c = new int(7);
myset.insert(a);
myset.insert(b);
myset.insert(c);
cout << "Set contains: ";
// (outputs: 5 6 7)
for (auto i = myset.begin(), end = myset.end(); i != end; ++i)
{
cout << **i << " ";
}
cout << endl << "Modifying *a" << endl;
*a = 9; // point of interest
cout << "Set contains: ";
// (outputs: 9 6 7 - unsorted order)
for (auto i = myset.begin(), end = myset.end(); i != end; ++i)
{
cout << **i << " ";
}
cout << endl;
cin.get();
return 0;
}
1) Ai-je raison que j'invoque un comportement non défini? L'état complet de myset
est-il invalide après la ligne *a = 9;
?
2) Est-ce la seule façon correcte d'effacer, puis de réinsérer a
?
3) Est-il possible, une fois que *a = 9;
a été exécuté, de rééquilibrer l'ensemble dans un ordre trié, avec un comportement bien défini?
Je choisirai Oui, Oui, Non. –
Est-ce qu'un comportement est défini après cette ligne? Pourriez-vous sûrement itérer sur l'ensemble (avec un ordre indéfini) par exemple? – AshleysBrain
Undefined ne fonctionne pas de cette façon. Une fois que vous invoquez un comportement indéfini, tous les paris sont désactivés. Votre programme peut faire n'importe quoi, y compris semblant continuer à travailler. Jusqu'à ce que non. Habituellement lors de la démonstration du code pour quelqu'un d'important. – KeithB