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

C++ Discussion :

conversion référence -> itérateur


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut conversion référence -> itérateur
    Bonjour,

    je veux récupérer un itérateur à partir d'une référence. C'est pour connaître la position de l'objet par rapport au début du vecteur. J'ai essayé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typename std::vector<T>::iterator ref2iter(T& x)
    {
        return &x ;
    } ;
    et j'ai eu ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    conversion from ‘double*’ to non-scalar type ‘std::vector<double, std::allocator<double> >::iterator {aka __gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >}’ requested
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Bonjour !

    Un itérateur est lié à un conteneur, tu ne pourras donc pas en obtenir un juste à partir d'une référence.
    Pour avoir un itérateur sur un élément à partir de sa référence, tu peux utiliser std::find
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Comme dit @dragonjoker59, un iterator est lié à un conteneur, tu peux utiliser le couple find/distance pour connaitre sa position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    using std::begin;
    using std::end;
    const auto val = { 3, 0, 1, 2 };
    std::vector<int> vec(begin(val), end(val));
     
    // trouver l'emplacement de 1
    const auto it = std::find(vec, 1);
    int index = std::distance(begin(vec), it); // c'est un std::iterator_traits<std::vector<int>::const_iterator>::difference_type, surement un typedef sur long.
    // l'utilisation de int est safe si le conteneur contient moins de ~2 milliards d'éléments.
    assert(index == 2);

  4. #4
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut arythmétique de pointeur ?
    merci de vos réponses.

    en fait c'est pas une valeur que j'ai mais une référence donc une adresse.
    en C de papy, je ferai la différence entre le pointeur que j'ai et celui du début de tableau et j'aurais sa distance.
    Je peux reformuler ma question en demandant : comment faire l’équivalent d'une arithmétique de pointeur dans un vecteur, en utilisant begin() et l'adresse d'un de ses éléments ?
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    vec.begin() + (&x - &vec.front())ou
    vec.begin() + (&x - &*vec.begin())
    Mais ça ne fonctionne qu'avec les containers ayant des éléments stockés de manière contigus.

  6. #6
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    J'ai essayé ça. Ca compile mais j'ai un résultat aberrant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <typename T, typename N> class Dem : public std::vector<T>
    {
    ....
    // ==============================================
        N distance(T& x)
    // ==============================================
        {
            T *a = &(*(this->begin())) ;
            T *b = &x ;
            return b-a ;
        } ;
    ....
    } ;
    pourtant cette fonction là est ok:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // ==============================================
        N verif_taille()
    // ==============================================
        {
            T *a = &(*(this->begin())) ;
            T *b = &(*(this->end())) ;
            auto t = b-a ;
            if (t==ncells)
            {
                std::cout << "taille ok" << std::endl ;
            }
            else
            {
                std::cout << "actuelle " << ncells << ". Prétendue " << t << std::endl ;
            }
            return t ;
        } ;
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Il faut que `x` provienne du vecteur, la moindre copie avant l'envoi à la fonction et c'est foutu.

    Tu peux ajouter un assert pour vérifier: assert(this->data() <= &x && &x < this->data() + this->size());

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. [XL-2007] Conversion et style de référence
    Par Menhir dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/06/2015, 18h46
  2. map référence et itérateur
    Par _niko_ dans le forum SL & STL
    Réponses: 2
    Dernier message: 20/10/2011, 20h20
  3. Référence sur un élèment d'un itérateur
    Par analgesic_86 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 17/03/2010, 18h33
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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