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 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