
Envoyé par
camboui
???
Non seulement ça compile, mais en plus ça s'exécute. Voici un petit code de test
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é
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.
Pourrais tu préciser quel compilateur tu utilise 
Parce que j'ai effectué un copier / coller de ton code, et j'ai un fantastique
1 2 3 4
| D:\projects\testC++\main.cpp||In function 'int main()':|
D:\projects\testC++\main.cpp|34|error: assignment of data-member 'MaStruct::u_' in read-only structure|
D:\projects\testC++\main.cpp|37|error: assignment of data-member 'MaStruct::u_' in read-only structure|
||=== Build finished: 2 errors, 0 warnings ===| |
comme on est en droit de s'y attendre 
la ligne 34 étant le fameux p.first->u_=10;//clé modifiée, set "instable" ?
(testé avec Gcc 4.5.0)
d'ailleurs, si on essaye de modifier s_ avec un code proche de
p.first->s_=std::string("salut");
on obtient une erreur du genre de
D:\projects\testC++\main.cpp|35|error: passing 'const std::string' as 'this' argument of 'std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]' discards qualifiers|
parce que c'est l'opérateur d'affectation de la classe std::string qui... n'est pas applicable sur une donnée constante (ce qui prouve bel et bien que c'est toute la structure qui est considérée constante
Partager