???
Non seulement ça compile, mais en plus ça s'exécute. Voici un petit code de test
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| struct MaStruct
{
std::string s_;
unsigned u_;
MaStruct(unsigned u=0): u_(u) {}
friend bool operator<(MaStruct const & l, MaStruct const & r)
{
return l.u_<r.u_;
}
};
int main()
{
std::set<MaStruct> myset;
MaStruct m(5);
m.s_="toto";
myset.insert(m);
m.u_=1;
myset.insert(m);
m.u_=9;
myset.insert(m);
std::set<MaStruct>::iterator it;
for (it=myset.begin(); it!=myset.end(); ++it)
std::cout << it->u_ << std::endl;
std::cout << std::endl;
m.u_=3;
std::pair<std::set<MaStruct>::iterator, bool> p=myset.insert(m);
p.first->u_=10;//clé modifiée, set "instable" ?
m.u_=7;
p=myset.insert(m);
p.first->u_=1;//clé modifiée, set "instable" ?
for (it=myset.begin(); it!=myset.end(); ++it)
std::cout << it->u_ << std::endl;
return 0;
} |
Voici le résultat affiché
Code:
1 2 3 4 5 6 7 8 9
| 1
5
9
1
10
5
1
9 |
Non seulement on peut se retrouver avec des doublons dans un std::set<> mais en plus ses éléments ne sont pas ordonnés lorsqu'on le parcourt via ses iterators comme on doit le faire.
Je suis un peu "choqué" !
Il manque comme un garde-fou.