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 :

Maintenir une référence sur un objet d'un vector


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiant Game Designer
    Inscrit en
    Août 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Etudiant Game Designer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Maintenir une référence sur un objet d'un vector
    bonjour,
    je cherche à maintenir des références(ou pointeurs) sur des objets contenus dans un vector (en réalité je stocke ces références dans un autre vector à l'aide de reference_wrapper). J'ai remarqué que lorsque je modifie le vector (celui qui contient les objets), les refrence_wrapper ne "pointent" (je mets entre guillement parceque c'est pas vraiment des pointeurs) plus sur les objets en question. J'ai réussi à reproduire le phénomène à petite échelle :

    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
    #include <iostream>
    #include <vector>
     
     
    int main(){
            //je crée un vector de int
    	std::vector<int> tab;
    	tab.push_back(5);//je push 5 à la fin
    	std::reference_wrapper<int> n = tab[0];//je crée une référence sur ce 5 que je viens de push
     
    	std::cout << n << std::endl;//je l'affiche
    	tab.push_back(3);//je push 3 dans le vector
    	std::cout << n << std::endl;//je réaffiche n, (je m'attend à ré-afficher 5)
     
    	std::cin.get();
    	return 0;
    }
    J'utilise ici un reference_wrapper mais j'ai le même problème avec un pointeur ou une référence.

    En sortie j'ai :

    Du coup ma question est la suivante : Comment maintenir une référence (ou un pointeur ça m'importe peu) sur un objet dans un vector ? est-ce que je dois utiliser un autre container de la STL ? est-ce que je dois utiliser des pointeurs intelligent (shared_ptr par exemple ?) ?
    merci d'avance.

  2. #2
    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,

    Un std::vector encapsule un tableau dynamique, à chaque push_back tu risques une réallocation, si tu gardes un pointeur sur ce tableau, il sera invalidé (comme ici).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::vector<int*> v;
     
    v.push_back(new int(42));
    int **pp = &v[0];
    int *p = v[0];
    int ind = 0;
    v.resize(42);
     
    // pp invalide
    // p valide
    // vec[ind] valide
    Ou plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vecor<int> v;
    v.emplace_back(42);
    int ind = 0;
    v.resize(42);
    // v[ind] valide

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Il me semble qu'il existe un moyen beaucoup plus simple d'arriver au même résultat: stocker, dans ton autre vecteur, les index des éléments qui t'intéressent...

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/05/2010, 16h48
  2. Ajouter une textures sur des objets 3D openGL
    Par rere56 dans le forum 3D
    Réponses: 1
    Dernier message: 27/07/2007, 11h08
  3. Réponses: 2
    Dernier message: 26/01/2007, 10h50
  4. Réponses: 2
    Dernier message: 13/12/2006, 13h39
  5. Comment avoir une référence sur une Vue
    Par Philippe299 dans le forum MFC
    Réponses: 1
    Dernier message: 12/08/2005, 10h03

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