| 12
 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
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 | template <typename INDICE, typename TYPE> 
void ListeTriee<INDICE,TYPE>::Ajouter(INDICE Indice, boost::shared_ptr<TYPE> Element)
{
	int cpt;
	boost::shared_ptr<INDICE> IndicePtr(&Indice); //(Pour pouvoir faire appel à Liste::Ajouter()
	                                              // il faut mettre comme premier argument un
	                                              // shared_ptr)
	
	// On cherche ici à insérer dans la liste l'élément tel que Indice, placé au même indice que Element,
	// forme une suite croissante du tableau Indices.
	
	// Pour cela, nous allons créer un nouveu tableau d'éléments.
	boost::shared_array<boost::shared_ptr<TYPE> > NouveauTableau(new boost::shared_ptr<TYPE>[Taille+1]);
	// On interchange TableauDeReference avec le tableau que ous venons de créer.
	this->TableauDeReference.swap(NouveauTableau);
	// On échange tout entre l'ancien tableau et le nouveau :
	for (cpt=0 ; cpt < Taille ; cpt++)
	{
	  this->TableauDeReference[cpt].swap(NouveauTableau[cpt]);
	}
	// Maintenant, notre nouveau TableauDeReference contient un emplacement NULL à
	// l'indice "Taille". Insérons-y notre élément.
	this->TableauDeReference[Taille].reset(Element.get());
	
	// Il faut faire la même chose avec notre liste d'indices.
	// Premièrement, ajouter à la fin de la liste l'indice pris en argument de notre fonction.
	Indices->Ajouter(IndicePtr, FIN);
	// Nous savons que la liste d'indices est triée, sauf évidemment pour le dernier indice, 
	// que nous venons d'ajouter sans faire attention à sa valeur.
	// Nous allons donc rechercher l'indice qui convient bien.
	
	cpt = Taille-1;
	while (cpt >= 0 && cpt < Taille)
	{ // si l'indice n° cpt a une valeur supérieure à l'indice n° cpt+1
	  if (*(Indices->GetIndice(cpt)) > *(Indices->GetIndice(cpt+1)) )
	  { // Alors on échange les valeurs des indices et les valeurs des éléments correspondants.
	     Indices->GetIndice(cpt).swap( Indices->TableauDeReference[cpt+1] );
	     this->TableauDeReference[cpt].swap( this->TableauDeReference[cpt+1] );
	  }
	  else
	  { // Si ce n'est pas le cas, c'est que le tri est fini ; on sort de la boucle.
	     break;
	  }
	  // Puis c'est reparti pour un tour.
	  cpt--;
	}
	
	
	// La taille de notre liste est donc bien égale à Taille+1 maintenant.
	Taille++;
} | 
Partager