IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

indice d'un std::iterator !


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Points : 1 256
    Points
    1 256
    Par défaut indice d'un std::iterator !
    Salut,

    J'ai décidé de passer à la STL (avec <functional> et <algorithm> ) pour améliorer les performance de mon code algorithmique. Je viens de commencer les modifications ce matin, et j'ai un premier probléme .

    Dans ma fonction rand() je veux renvoyer l'indice du 1er élément supérieur à rand (généré aléatoirement, mais utile lol). Ceci reviens à recupérer l'indice à partir de l'iterateur!? Dans mon code *it donne la valeur et non l'indice.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int
    randFromDistribution::rand()
    {
      double rand = (double)(std::rand()) / RAND_MAX;
     
      std::vector<double>::iterator it = std::find_if( _dist.begin(), _dist.end(), std::bind2nd( std::greater<double>() , rand));
      return 1; // return it; temporaire pour compiler!
    }
    Merci
    ++
    AlloSchool, votre école sur internet.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::distance(v.begin(), it); // 2
    Pour un itérateur non à accès aléatoire, ce code ne compilera pas (1) ou sera lent (2). Pour un itérateur de vecteur, ça ne pose pas de problème.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre chevronné

    Homme Profil pro
    Appui fonctionnel senior
    Inscrit en
    Juin 2007
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Appui fonctionnel senior
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 461
    Points : 2 211
    Points
    2 211
    Par défaut
    Bonsoir,

    D'après le nom de ta fonction, je présume que tu veux mélanger le contenu de ton vecteur. Si c'est la cas, il existe une méthode shuffle (dans la stl), qui ressemble à ça si je me souviens bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // T pour n'importe quoi !
    std::vector<T> vec;
    shuffle( vec.begin(), vec.end() );
    Sinon, dans un vector, les indices sont rangés de 0 à n sans interruption. Pour trouver l'indice supérieur au nombre aléatoire, il tu suffit de rajouter 1 à ton nombre aléatoire (en vérifiant que tu sortes pas de la limite de ton vector bien sûr).

    J'espère que c'est bien ce que tu voulais dire

  4. #4
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Points : 1 256
    Points
    1 256
    Par défaut
    Merci pour vos réponses,

    Lutarez
    Ceci me parrait bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::distance(v.begin(), it);
    Je me demandais s'il n'y a pas de fonction qui retourne cela directement.

    JolyLoic
    Je fait bien un tirage dans ma fonction, mais il n'est pas aléatoire. il suit une loi indiquer par le vecteur _dist ...

    ++
    AlloSchool, votre école sur internet.

Discussions similaires

  1. std::iterator, Vector.begin() et généricité
    Par Neilos dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/04/2012, 15h09
  2. Réponses: 10
    Dernier message: 30/06/2008, 19h59
  3. Iterator et std::set
    Par Rodrigue dans le forum SL & STL
    Réponses: 1
    Dernier message: 26/09/2006, 16h06
  4. [dev-C++]std::list<tree_node<T>*> iterator;
    Par jmv dans le forum Dev-C++
    Réponses: 7
    Dernier message: 06/05/2005, 13h14
  5. T& à partir d'un std::set<T>::iterator
    Par karmaki dans le forum SL & STL
    Réponses: 3
    Dernier message: 08/02/2005, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo