begin process at 2012 02 13 02:52:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > TEMPLATE DE VECTEUR AVEC TIRAGE ALEATOIRE (C++)

TEMPLATE DE VECTEUR AVEC TIRAGE ALEATOIRE (C++)


 Information sur la source

Note :
Aucune note
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é :5 603 / 102

Auteur : Sunglasses

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture VISUALISEUR RVB AVEC QT
Source avec Zip BIBLIOTHÈQUE DE GESTION DE FILES DYNAMIQUES
Source avec Zip BIBLIOTHÈQUE DE GESTION DE FILES STATIQUES
Source avec Zip BIBLIOTHÈQUE DE GESTION DE MATRICES EN C
Source avec Zip BIBLIOTHÈQUE DE GESTION DES PILES DYNAMIQUES EN C

 Sources de la même categorie

Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro
Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974
Source avec Zip JOUR DE NAISSANCE par fredg19

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GENERE BMP par lajouad
UTILISATION DES TYPELIST EN C++ par wyden
Source avec Zip EXPERIENCES ALEATOIRES par cczerty
Source avec Zip Source avec une capture [C++] CLASSE DE GESTION DE FONCTIONS par pop70
Source avec Zip POINTEUR INTELLIGENT par DrMckey

Commentaires et avis

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.

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

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.

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.

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 !

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 !

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,070 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales