Bonjour.

Voilà une journée que je me prend la tête avec des set, aussi, j'en appel à vous


Alors voilà.
J'ai les objets suivant
  • Une classe Tetra
  • Une classe Solution qui est un set de Tetra

Une solution est composé de tetras, sans doublons, et j'aimerais qu'il soit automatiquement triés par le set

voilà donc ce que j'ai fait pour mes tetras
Tetra.h
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
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
class Tetra {
public:
	Tetra(ui s1, ui s2, ui s3, ui s4);
 
 
	ui operator[] (ui ref) {return cases[ref];};
 
 
	void set(ui s1, ui s2, ui s3, ui s4);
 
	int getType()    { return type;}
	ui getcase(ui i) { return cases[i];}
	ui getX(ui i)    { return xcases[i];}
	ui getY(ui i)    { return ycases[i];}
 
 
private:
	int findType();
 
	ui cases[4];  // par ordre croissant
	ui xcases[4]; // les coord x des cases
	ui ycases[4]; // les coord y des cases
	int type; // 5 differents (cf define)
 
};
 
struct triTetraCroissant
{ 
	bool operator ()( Tetra & t1,  Tetra & t2) const 
	{ 
		return t1.getcase(0) < t2.getcase(0);
	}
};
Vous aurez reconnus la structure qui est dans votre FAQ, mais je ne suis pas du tout sur qu'il faille la mettre ici ... c'est bon?


Et voici ce que j'ai mis dans solution.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
	Solution ();
	int isOK();
 
	int addTetra(Tetra);
 
 
private:
	std::set<Tetra> solution;
	ui tetra_par_type[5];
 
 
};
et dans solution.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int Solution::addTetra(Tetra tetra)
{
	if (tetra_par_type[ tetra.getType() -1] > 2)
	{
		return SOLUTION_INVALIDE;
	}
	// pair <Tetra, bool> p;
	solution.insert(tetra);
	// if (p.second) return SOLUTION_INVALIDE;
 
	// if (solution.size() == 10) return SOLUTION_COMPLETE;
 
	return SOLUTION_PARTIELLE;
 
}
Alors ce que j'essaie de faire :
Quand on construit un objet Solution, son set est vide.
Ensuite au fur et a mesure qu'on va analyser le problème, on va ajouter des Tetra à la solution (avec la méthode Solution::addTetra(Tetra tetra)), celle ci vérifie que le type du tétra est autorisé (car une solution valide doit respecter certains critère là dessus)
Ensuite il ajoute le tetra au set. (déjà là ça plante, avec une erreur illisible de la STD (une histoire de pointeur ou je ne sais quoi) une erreur qui ressemble à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_tree.h:877:   instantiated from «std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::insert_unique(const _Val&) [with _Key = Tetra, _Val = Tetra, _KeyOfValue = std::_Identity<Tetra>, _Compare = std::less<Tetra>, _Alloc = std::allocator<Tetra>]»
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_set.h:315:   instantiated from «std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, _Alloc>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = Tetra, _Compare = std::less<Tetra>, _Alloc = std::allocator<Tetra>]»
Alors voici les précisions que je demande :
  • Comment utiliser pair pour savoir si l'insertion dans le set s'est faite, ou si c t un doublon ?
  • Comment insérer un Tetra dans le set
    car solution.insert(tetra); ne fonctionne pas des masses, j'ai essayer diverses solution, avec des *, des &, avec rien du tout etc ... bref je pige pas cette fonction, d'autant plus que dans tout les exemples que j'ai lu ça se faisait le plus simplement du monde avec justement ce que j'ai écrit...
  • Comment fonctionne le tri automatique des set, parceque j'ai l'impression que mon triTetraCroissant pose aussi des problème