STL : std::set probl�me avec insert ...
Bonjour,
j'aimerais utilis� std::set, mais j'ai quelques ennuis ...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| // ------
class SCImports
{
public:
SCImports(const std::string & etat1, const std::string & etat2)
: nom1(etat1),nom2(etat2)
{
}
std::string nom1;
std::string nom2;
};
// ------
// déclaration dans une autre classe Test
std::set<SCImports> listeSCImports;
// ------
// utilisation dans cette autre classe Test
((std::set<SCImports>) listeMaClasse).insert((SCImports)classe); |
Si je compile la classe Test, j'obiens de visual 2002 cette erreur :
C:\Program Files\Microsoft Visual Studio .NET\Vc7\include\functional(139): error C2676: binary '<' : 'const SCImports' does not define this operator or a conversion to a type acceptable to the predefined operator
d'o� ma question, est-ce que je dois surcharger l'op�rateur "<" ?
Est-ce que �a ne devrait pas plut�t �tre l'op�rateur "==" pour d�terminer si la cl� (l'�l�ment � ins�rer) est d�j� pr�sent dans la "liste" set ?
Si je dois surcharger l'op�rateur comment je fais avec ma classe qui a seulement 2 string en attribut, et plus int�ressant comment je fais si c'est une classe qui a plein d'attributs ?
Merci de vos r�ponses, j'esp�re avoir �t� clair. Cependant, il se peut que je n'ai pas bien compris le fonctionnement de set (qui pour moi est une sorte de liste de cl� donc impossible d'avoir 2 fois la m�me cl� dans set), si c'est le cas merci de me donner d'autres informations...
En passant, un lien int�ressant sur les containers :
http://www.mines.u-nancy.fr/~tombre/...olyCpp008.html
Big. K
Re: STL : std::set probl�me avec insert ...
Citation:
Envoy� par Big K.
Bonjour,
C:\Program Files\Microsoft Visual Studio .NET\Vc7\include\functional(139): error C2676: binary '<' : 'const SCImports' does not define this operator or a conversion to a type acceptable to the predefined operator
d'o� ma question, est-ce que je dois surcharger l'op�rateur "<" ?
Est-ce que �a ne devrait pas plut�t �tre l'op�rateur "==" pour d�terminer si la cl� (l'�l�ment � ins�rer) est d�j� pr�sent dans la "liste" set ?
Pour utiliser 'set' il faut disposer d'un moyen de comparer deux �l�ments.
Il est possible de fournir une telle fonction lors de l'instanciation du template.
Si aucune fonction de comparaison n'est fournie alors '<' est utilis� par d�faut.
La fonction doit d�finir une relation d'ordre faible entre les �l�ments du set.
Pour plus d'info http://www.sgi.com/tech/stl/set.html
Le truc � retenir c'est que la comparaison doit �tre irreflexive. C-�-d que 'compare(a, a)' retourne faux. En gros, �a marche avec '<' ou '>' mais pas avec '<=' ou '>='
Pour r�soudre le probl�me il y a alors deux fa�on de faire:
- surcharger l'op�rateur < (pas terrible).
- d�finir une fonction de comparaison.
On peux, par exemple, concat�ner les deux cha�nes et de les comparer.
Par exemple
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
struct SCImportsCompare
{
bool operator()(const SCImports& lhs, const SCImports& rhs) const
{
string s1(lhs.nom1);
s1.append(lhs.nom2);
string s2(rhs.nom1);
s1.append(rhs.nom2);
return ( s1.compare(s2) < 0 );
}
};
// Création du Set
set<SCImports, SCImportsCompare> mySet; |