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 :

allocation dynamique d'un tableau de taille non connue


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut allocation dynamique d'un tableau de taille non connue
    Bonjour tout le monde,
    Est-il réellement possible en C++ de créer dynamiquement un tableau de structure quand on ne connait pas sa taille définitive? si oui comment?

    Je m'explique je veux créer un tableau d'un objet perso, le problème c'est que je les ajoutes un par un, donc lors de l'allocation je ne connais pas encore sa taille.
    Je code en C++, donc je voudrais ne pas utiliser malloc et realloc, mais des new
    Est-il correct d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //initialisation
    monObjet ** tab = new monObjet*;
    cpt = 0;
    et ensuite lorsque je veux rajouter un nouvel élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //ajout élément
    monObjet[cpt] = new monObjet;
    cpt++;

  2. #2
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Pourquoi ne pas utiliser un vector ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::vector<MonObjet> tab;
    //...
    tab.push_back(ObjetARajouter);

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2
    Par défaut
    Je pense qu'en utilisant des conteneurs de la stl .
    vector par exemple, il doit être possible de faire ce que tu cherches.

    Pour t'informer dessus il doit y avoir des exemples dans la faq c++ je pense.

    [edit] ah on a été plus rapide que moi ^^

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    non on ne peut pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet ** tab = new monObjet* [MAX_ELEMS];
    est correct par contre et ensuite tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //ajout élément
    monObjet[cpt] = new monObjet;
    cpt++;
    Sinon tu peux utiliser les vector, deque ou n'importe quel conteneur de la STL qui sont des tableaux dynamique et qui gerent seuls les tailles.

    C'est pas terrible par contre si tu doit constament (enormement de fois par seconde) ajouter ou enlever des elements

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Donc pour vous le mieux c'est d'utiliser un vecteur!!
    Mais est-ce performant? car mon programme analyse beaucoup de chose, et il se doit d'être le plus rapide possible

  6. #6
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Par défaut
    Ben disons que dans ton cas, si tu veux declarer un tableau dynamique, tu es oblige de passer par un conteneur STL (cf posts Weremarc & NiamorH). Et autrement, il est relativement facile de manipuler les objets de ces conteneurs. Apres au niveau complexite et temps d'execution je n'y connais pas grand chose donc je laisse qq1 de plus experimente donner son avis mais je pense que de toutes facons ca ne peut pas etre plus lent que ton tableau ^^

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    si car je pense qu'un vecteur se redimensionne à chaque ajout ou suppression d'elements donc reallocation de memoire, recopie du tableau.
    Je suis pas sur de ça mais si tu veux quelque chose de tres performant il vaut mieux se bricoler une petite classe qui fait ça.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    Citation Envoyé par NiamorH
    si car je pense qu'un vecteur se redimensionne à chaque ajout ou suppression d'elements donc reallocation de memoire, recopie du tableau.
    Je suis pas sur de ça mais si tu veux quelque chose de tres performant il vaut mieux se bricoler une petite classe qui fait ça.
    Dans ce cas, et sans utiliser les malloc et realloc, les possibilités en C++ sont super limité!!
    Où la rigueur alloué le tableau par tranche, genre je définit des tranches de 50, donc au début j'alloue de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monObjet ** tab = new monObjet* [50];
    et ensuite lorsque je dépasse cette taille, je ralloue un espace de 2 fois ma tranche, et je fais un recopie du tableau ..... et ainsi de suite

  9. #9
    Membre Expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Par défaut
    Citation Envoyé par NiamorH
    si car je pense qu'un vecteur se redimensionne à chaque ajout ou suppression d'elements donc reallocation de memoire, recopie du tableau.
    Je suis pas sur de ça mais si tu veux quelque chose de tres performant il vaut mieux se bricoler une petite classe qui fait ça.
    Non; le vector va allouer par bloc (plusieurs objets à la fois). Au pire, tu peux faire un reserve pour définir un pool de départ qui te semble adapté selon le contexte.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Par défaut
    alors si je veux avoir l'équivalent d'un tableau à deux dimensions avec les vecteurs: il faut que je créé un structure et ensuite je fasse un vecteur de cette structure?
    Un exemple tout simple: un tableau 2D de int dont les dimension sont [2][N] => N n'étant pas connu d'où comme vous me le conseillez, l'utilisation de vecteur
    Comment s'y prendre?

  11. #11
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par kreeks
    alors si je veux avoir l'équivalent d'un tableau à deux dimensions avec les vecteurs: il faut que je créé un structure et ensuite je fasse un vecteur de cette structure?
    Un exemple tout simple: un tableau 2D de int dont les dimension sont [2][N] => N n'étant pas connu d'où comme vous me le conseillez, l'utilisation de vecteur
    Comment s'y prendre?
    Avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::pair<int, int> >
    par exemple !
    Ca va fonctionner très bien...

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Utiliser std::vector sera plus performant que de gérer un tableau à la main.

    Ensuite pour ce qui est des accès, tout est inliné donc ça n'ajoute aucun surplus à l'utilisation.

Discussions similaires

  1. [XL-2010] Déclarer un tableau de taille non connue
    Par raphael.abulker dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/11/2014, 09h45
  2. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  3. Réponses: 14
    Dernier message: 26/10/2006, 14h44
  4. Réponses: 13
    Dernier message: 01/10/2006, 00h25
  5. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02

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