Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TEMPLATE DE VECTEUR AVEC TIRAGE ALEATOIRE (C++)


Information sur la source

Catégorie :Divers Classé sous : template, vecteur, aleatoire, tirage Niveau : Initié Date de création : 26/02/2008 Date de mise à jour : 26/02/2008 20:44:24 Vu / téléchargé: 3 736 / 75

Note :
Aucune note

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


Description

Ce template donne une structure de vecteur avec possibilité de faire des tirages aleatoires dans celui-ci (il peut servir par exemple a faire du scheduling).

Fonctions disponibles :
- constructeur avec taille du vecteur en paramètre
- destructeur
- fonction d'ajout d'un élément dans le vecteur
- fonction de suppression d'un élément dans le vecteur
- fonction de tirage d'un élément dans le vecteur

Attention ! on ne peut pas modifier les éléments du vecteur si on a commencé à faire des tirages aléatoires et que tous les éléments du vecteur n'ont pas encore été tirés.

Il faut savoir également que la structure choisie est un tableau et que des décalages sont faits à chaque modification ou chaque tirage aléatoire. Il ne faut donc pas l'utiliser avec un nombre d'éléments trop important.

(j'utilise une fonction "random" définie dans les fichiers qui vont bien).
 

Source

  • #include "rand.hpp"
  • #include <iostream>
  • using namespace std;
  • //------------------------------------------------------------------------------
  • // Template pour structure de vecteur avec fonctionnalite
  • // de tirage aleatoire
  • //
  • //------------------------------------------------------------------------------
  • template <class T>
  • class AleaVect
  • {
  • protected :
  • int _sizeMax; // nombre maximal d'elements
  • int _size; // nombre d'elements actuels
  • int _state; // etat : 0 -> on peut ajouter/enlever des elements
  • // 1 -> on est en cours de tirage dans la vecteur
  • T * _vect1; // vecteur complet (etat 0)
  • // ou contenant les elements non encore tires (etat 1)
  • T * _vect2; // vecteur contenant les elements tires
  • int _size1; // nbre d'elements dans le vecteur 1
  • int _size2; // nbre d'elements dans le vecteur 2
  • public :
  • AleaVect(int inSizeMax); // constructeur
  • ~AleaVect(); // destructeur
  • int Ajoute(T inType); // ajout d'un element
  • int Enleve(T inType); // retrait d'un element
  • T Alea(); // tirage aleatoire d'un element
  • };
  • //------------------------------------------------------------------------------
  • // Constructeur
  • //
  • // inSizeMax : nombre maximal d'elements du vecteur
  • //
  • //------------------------------------------------------------------------------
  • template <class T>
  • AleaVect<T>::AleaVect(int inSizeMax)
  • {
  • _sizeMax = inSizeMax;
  • _size = 0;
  • _vect1 = new T[inSizeMax];
  • _vect2 = new T[inSizeMax];
  • _state = 0;
  • }
  • //------------------------------------------------------------------------------
  • // Destructeur
  • //
  • //------------------------------------------------------------------------------
  • template <class T>
  • AleaVect<T>::~AleaVect()
  • {
  • delete[] _vect1;
  • delete[] _vect2;
  • }
  • //------------------------------------------------------------------------------
  • // Fonction d'ajout d'un element
  • //
  • // inType : element a ajouter
  • // retourne 0 si on peut ajouter et 1 sinon
  • //
  • //------------------------------------------------------------------------------
  • template <class T>
  • int AleaVect<T>::Ajoute(T inType)
  • {
  • if(_size<_sizeMax && _state==0)
  • {
  • _vect1[_size++]=inType;
  • return 0;
  • }
  • return 1;
  • }
  • //------------------------------------------------------------------------------
  • // Fonction de retrait d'un element
  • //
  • // inType : element a retirer
  • // retourne 0 si retrait effectue et 1 si l'element n'etait pas present
  • //
  • //------------------------------------------------------------------------------
  • template <class T>
  • int AleaVect<T>::Enleve(T inType)
  • {
  • bool trouve = false;
  • int i = 0;
  • if(state==0) // si nous ne sommes pas en cours de tirage
  • {
  • while(!trouve && i<_size) // parcours du vecteur
  • {
  • if(_vect1[i] == inType)
  • trouve = true;
  • else
  • i++;
  • }
  • if(trouve) // si l'element est present
  • {
  • for(int j = i ; j<_size-1 ; j++) // decalage du vecteur pour effacer
  • _vect1[j] = _vect1[j+1];
  • _size--;
  • return 0; // element efface
  • }
  • }
  • return 1; // non trouve
  • }
  • //------------------------------------------------------------------------------
  • // Fonction de tirage d'un element
  • // (attention : le vecteur ne doit etre vide)
  • //
  • // retourne l'element tire
  • //
  • //------------------------------------------------------------------------------
  • template <class T>
  • T AleaVect<T>::Alea()
  • {
  • T res; // variable contenant le resultat;
  • if(_state == 0) // si on est pas en phase de tirage
  • {
  • _state = 1; // on se met en etat de tirage aleatoire
  • _size1 = _size;
  • _size2 = 0;
  • }
  • int r = random(0, _size1); // tirage d'un index aleatoire
  • res = _vect1[r]; // on transfere dans le vecteur 2
  • _vect2[_size2] = res;
  • for(int j = r ; j<_size1-1 ; j++) // decalage du vecteur
  • _vect1[j] = _vect1[j+1];
  • _size1--; // reactualisation des tailles des vecteurs
  • _size2++;
  • if(_size1 == 0) // si tous les elements ont ete tires
  • {
  • T * temp;
  • temp = _vect1;
  • _vect1 = _vect2;
  • _vect2 = temp;
  • _state = 0;
  • }
  • return res; // element aleatoire
  • }
#include "rand.hpp"
#include <iostream>

using namespace std;

//------------------------------------------------------------------------------
//   Template pour structure de vecteur avec fonctionnalite
//      de tirage aleatoire
//
//------------------------------------------------------------------------------
template <class T>
class AleaVect
{
   protected :
      int _sizeMax; // nombre maximal d'elements
      int _size;    // nombre d'elements actuels
      int _state;   // etat : 0 -> on peut ajouter/enlever des elements
                    //        1 -> on est en cours de tirage dans la vecteur
      T * _vect1;   // vecteur complet (etat 0)
                    // ou contenant les elements non encore tires (etat 1)
      T * _vect2;   // vecteur contenant les elements tires
      int _size1;   // nbre d'elements dans le vecteur 1
      int _size2;   // nbre d'elements dans le vecteur 2
      
   public :
      AleaVect(int inSizeMax); // constructeur
      ~AleaVect();             // destructeur
      int Ajoute(T inType);    // ajout d'un element
      int Enleve(T inType);    // retrait d'un element
      T Alea();                // tirage aleatoire d'un element
};

//------------------------------------------------------------------------------
//   Constructeur
//
//   inSizeMax : nombre maximal d'elements du vecteur
//
//------------------------------------------------------------------------------
template <class T>
AleaVect<T>::AleaVect(int inSizeMax)
{
   _sizeMax = inSizeMax;
   _size = 0;
   _vect1 = new T[inSizeMax];
   _vect2 = new T[inSizeMax];
   _state = 0;
}

//------------------------------------------------------------------------------
//   Destructeur
//
//------------------------------------------------------------------------------
template <class T>
AleaVect<T>::~AleaVect()
{
   delete[] _vect1;
   delete[] _vect2;
}

//------------------------------------------------------------------------------
//   Fonction d'ajout d'un element
//
//   inType : element a ajouter
//   retourne 0 si on peut ajouter et 1 sinon
//
//------------------------------------------------------------------------------
template <class T>
int AleaVect<T>::Ajoute(T inType)
{
   if(_size<_sizeMax && _state==0)
   {
      _vect1[_size++]=inType;
      return 0;
   }
   return 1;
}

//------------------------------------------------------------------------------
//   Fonction de retrait d'un element
//
//   inType : element a retirer
//   retourne 0 si retrait effectue et 1 si l'element n'etait pas present
//
//------------------------------------------------------------------------------
template <class T>
int AleaVect<T>::Enleve(T inType)
{
   bool trouve = false;
   int i = 0;
   
   if(state==0) // si nous ne sommes pas en cours de tirage
   {
      while(!trouve && i<_size) // parcours du vecteur
      {
         if(_vect1[i] == inType)
            trouve = true;
         else
            i++;
      }
   
      if(trouve) // si l'element est present
      {
         for(int j = i ; j<_size-1 ; j++) // decalage du vecteur pour effacer
            _vect1[j] = _vect1[j+1];
         _size--;
         return 0; // element efface
      }
   }
   return 1; // non trouve
}

//------------------------------------------------------------------------------
//   Fonction de tirage d'un element
//     (attention : le vecteur ne doit etre vide)
//
//   retourne l'element tire
//
//------------------------------------------------------------------------------
template <class T>
T AleaVect<T>::Alea()
{
   T res; // variable contenant le resultat;
   
   if(_state == 0) // si on est pas en phase de tirage
   {
      _state = 1; // on se met en etat de tirage aleatoire
      _size1 = _size;
      _size2 = 0;
   }

   int r = random(0, _size1); // tirage d'un index aleatoire

   res = _vect1[r]; // on transfere dans le vecteur 2
   _vect2[_size2] = res;

   for(int j = r ; j<_size1-1 ; j++) // decalage du vecteur
      _vect1[j] = _vect1[j+1];

   _size1--; // reactualisation des tailles des vecteurs
   _size2++;

   if(_size1 == 0) // si tous les elements ont ete tires
   {
      T * temp;
      temp = _vect1;
      _vect1 = _vect2;
      _vect2 = temp;

      _state = 0;
   }

   return res; // element aleatoire
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

26 février 2008 11:14:03 :
modif description
26 février 2008 20:44:24 :
menues corrections

Commentaires et avis

signaler à un administrateur
Commentaire de juju12 le 26/02/2008 20:06:41

A l'allocation dynamique de tableaux new _vect1[size] correspond l'opérateur libération de tableaux delete[] vect1.

signaler à un administrateur
Commentaire de Sunglasses le 26/02/2008 20:49:11

Merci, voilà qui est corrigé (ainsi - au passage - que la fonction de suppression qui ne vérifiait pas l'état de la classe, car il faut que l'on ne soit pas en cours de tirage pour modifier le vecteur).

Mais le "delete vect1" ne marche-t-il pas quand même ? en tout cas mon compilo l'accepte, et à l'exécution, on dirait que ça ne pose pas de problème. (ou alors une fuite de mémoire peut-être ?)

signaler à un administrateur
Commentaire de exar le 27/02/2008 14:50:17

Plus court avedc la STL:

[code]
#ifndef __VECTORALEA_H__
#define __VECTORALEA_H__
#include <vector>
#include <algorithm>
using namespace std;

template<class T>
class VectorAlea: public vector<T>{
public:
   T Alea();
};

template<class T>
T VectorAlea<T>::Alea(){
   VectorAlea<T> tmp=*this;
   random_shuffle(tmp.begin(), tmp.end());
   T ret=tmp.back();
   tmp.pop_back();
   *this=tmp;
   return ret;
}

#endif
[/code]

Pour tester:
[code]
#include <cstdlib>
#include <iostream>
#include "vectoralea.h"

using namespace std;

int main(int argc, char *argv[])
{
    VectorAlea<int> tst;
    for(int cnt=1; cnt<=10; cnt++)
      tst.push_back(cnt);
    for(int cnt=0; cnt<10; cnt++)
      cout<<tst.at(cnt)<<endl;
    cout<<"************************"<<endl;
    for(int cnt=0; cnt<10; cnt++)
      cout<<tst.Alea()<<endl;
    return EXIT_SUCCESS;
}
[/code]

Sinon, code bien propre !
A+!

*********
«Asseyez-vous une heure près d'une jolie fille, cela passe comme une minute.  Asseyez-vous une minute sur un poêle brûlant, et cela passe comme une heure.  C'est cela la relativité.»

Albert Einstein.

signaler à un administrateur
Commentaire de exar le 27/02/2008 15:00:53

Au fait, j'ai fait ça en deux minutes, il faut contrôler que le vecteur n'est pas vide avant de tenter de renvoyer une valeur...
Bon courage !

*********
«Asseyez-vous une heure près d'une jolie fille, cela passe comme une minute.  Asseyez-vous une minute sur un poêle brûlant, et cela passe comme une heure.  C'est cela la relativité.»

Albert Einstein.

signaler à un administrateur
Commentaire de Sunglasses le 28/02/2008 20:08:42

C'est sûr qu'on peut réutiliser ce qui existe déjà, mais je fais ça pour apprendre et pour m'entrainer (Et puis aussi parce que j'aime bien réinventer la roue, oui, je l'avoue :-) ).

Faudra que je m'intéresse de plus près à la STL.

En tout cas merci du commentaire !

signaler à un administrateur
Commentaire de exar le 29/02/2008 04:42:52

Oui, c'est sur !
A noter que tu peux également utiliser ta propore fonction random.
Exemple:

#include <algorithm>
#include <functional>
#include <vector>

...

using namespace std;

ptrdiff_t random(prtdiff_t i){
   return srand()%i;
}

ptrdiff_t (*prandom)(ptrdiff_t)=random;

int main(){
   vector<int> v;
   // ici, on remplit le vecteur

   // appel de random_shuffle
   random_shuffle(v.begin(), v.end(), prandom);

...

}

Vraiment, je te conseille d t'intéresser à la STL, c'est très pratique !
Bonne continuation !

signaler à un administrateur
Commentaire de Sunglasses le 29/02/2008 09:57:29

J'utilise déjà ma propre fonction random :-) (voir dans les fichiers rand.cpp et rand.hpp). C'est une petite bibliothèque de fonctions aléatoire qu'on nous avait fait faire en TP mais j'ai juste laissé la fonction dont j'avais besoin dans mon programme.

Merci !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Template, surdéfinition d'opérateur et héritage ! [ par neodelphi ] Bonjour tout le monde ! pour un projet perso j'ai cod&#233; un template vector dans lequel on sp&#233;cifi la dimension du vecteur (ce qui donne par Classe contenant vecteur template [ par val3113 ] Bonjour,Je suis sur un programme cpp sous linux. J'ai créé une classe template "Vecteur" qui est censée pouvoir recevoir plusieurs types dont des clas une file Template dans un Vecteur Template [ par grand_duck ] voici le probl&#232;me j'ai une classe de vecteur template et une classe de file template je voudrais mettre ma file template dans mon vecteur est-ce Template ne marche pas ! [ par feanor11 ] Je veux utiliser le conteneur deque sous Microsoft Visual C++ 6.0. Je d&#233;clare le code comme suit : ----- #include &lt;deque&gt; deque&lt;int&gt; vector [ par Vincentsoft ] Salut, J'aimerai simplement savoir quelles diff&#233;rences (avantages et/ou inconv&#233;nients) y-a t'il entre un parcours de vecteur &#224; l'aide urgent c++! [ par imanedaoudi ] j'arrive pas &#224; voir l'erreur, normalement le programme marche avec la classe vecteur seulement lorsque j'ajoute la classe&nbsp; base il y a des e comment créer une instance d'un templates [ par neodelphi ] Bonjour, je suis en train de d&#233;couvrir les templates en c++ et j'ai donc essay&#233; de coder une classe CArray. Pour ce qui est des d&#233;clara Comment faire une Erase d'un élément dans un vecteur ayant une clé concatenée ? [ par dpfort ] Bonjour Je cherche un exemple de vecteur de suppression sur lequel pour une cl&#233; il y a 2 champs pour l'indentifiant. D'aller lire cet identifiant Singleton et héritage [ par Dany82 ] Voila mon probleme:J'utilise le template:template &lt;typename T&gt;class singleton{protected:&nbsp;// Constructor/Destructor&nbsp;singleton( ) {&nbsp Comment affecter une couleur a un vecteur en fonction de sa norme ? [ par serialtom ] Salut a tous !Je suis en train de developper un petit soft et il m est pose le probleme suivant :je dois afficher a l ecran une discretisation de cour


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.