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 :

Garder la trace d'une classe dans un vector


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut Garder la trace d'une classe dans un vector
    Bonjour, je voudrais savoir comment garder une trace d'un élément dans un vector, un peu comme l'on garderait un pointeur d'une struct que l'on aurait ajoutée dans un array en c.
    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Si le vector<> est constant en taille, il suffit de faire comme pour un tableau en utilisant un pointeur ou une référence sur l'élément. int* px = &vecteur[i];.
    Si le vector<> peut être modifié, les données bougeront il est impossible de pointer dessus. S'il s'agit d'un vector de pointeur (brut ou unique), on peut aussi pointer sur l'élément pointé. S'il s'agit d'un vector de shared_ptr, on peut garder la valeur du shared_ptr sous la forme d'un shared_ptr ou d'une weak_ptr.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    donc si mes éléments ne sont pas des pointeurs je suis obligé d'implémenter un système avec des identifiants et de parcourir tout le vecteur à chaque fois que j'ai besoin d'un élément ?

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Si le vector<> n'évolue que par ajout/suppression à le fin, on peut aussi conserver l'index de la position dans le vector<>. Sinon on devra rechercher l'élément par son identifiant, mais dans ce cas peut-être que le vector<> n'est pas la collection la plus adaptée. On peut utiliser :
    • list<> qui garanti une position fixe de ses éléments mais qui n'a plus d'accès direct et qui consomme de la place.
    • set<> qui gère des éléments triés
    • map<> qui permet d'associer une clef à un contenu
    • un vector<> ou deque<> trié pour une recherche plus rapide
    • ou les autres (multi_set<>, multi_map<>, unordered_set<>, forward_list<>, ...)

  5. #5
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 470
    Points : 6 106
    Points
    6 106
    Par défaut
    Bonjour,

    Si les éléments du std::vector ne sont pas des pointeurs :
    • Si la taille du vecteur ne bouge plus, on peut garder des pointeurs ou des références vers les éléments du vecteur. Ils resteront valides.
    • Si la taille du vecteur varie peu souvent et qu'on a un système d'identifiants, après chaque variation (ajout ou suppression), on peut appeler std::sort pour trier le vecteur. Alors, pour trouver un élément avec une complexité en O(log n), on peut utiliser std::binary_search ou std::partition_point.
    • Si la taille du vecteur varie souvent mais qu'on veut souvent y chercher un élément, alors ça veut dire que le choix de std::vector n'est vraisemblablement pas adapté.


    Il existe std::set et std::map qui permettent d'ajouter et de rechercher des éléments en O(log n). Ils sont généralement implémentés sous la forme d'un arbre binaire de recherche. Les pointeurs et les références vers les éléments restent valides tant que l'élément existe dans le conteneur.

    Il y a aussi std::unordered_set et std::unordered_map qui permettent d'ajouter et de rechercher des éléments avec une complexité constante. Ils sont implémentés sous la forme d'une table de hachage. Les pointeurs et les références vers les éléments peuvent être invalidés par l'ajout d'élément dans le conteneur.

    Tu as aussi std::deque qui ressemble un peu à std::vector. Cependant, quand tu ajoutes un élément au début ou à la fin, tous les pointeurs déjà existants vers tes éléments restent valides. C'est uniquement quand tu insères un élément ailleurs que tu invalides les pointeurs vers les autres éléments. Sous le capot, c'est un ensemble de petits tableaux de taille fixe qui restent au même endroit en mémoire. Quand on ajoute un élément à la fin, s'il n'y a pas assez de place dans le dernier petit tableau, un nouveau petit tableau est alloué sans que l'on touche aux autres petits tableaux.

    Remarque : Une partie de mon message fait un peu doublon avec le dernier message de dalfab, car je l'avais commencé avant qu'il ne publie le sien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment insérer une classe dans un vector
    Par razily dans le forum SL & STL
    Réponses: 9
    Dernier message: 26/02/2010, 18h55
  2. [Langage] Modification d'une classe dans un vector
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 19/12/2008, 03h44
  3. Garder le contenu d'une classe dans différentes pages
    Par kanabzh29 dans le forum Langage
    Réponses: 6
    Dernier message: 03/11/2008, 12h11
  4. Réponses: 4
    Dernier message: 10/02/2005, 16h10
  5. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57

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