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++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 10
    Points
    10
    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 du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    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
    Points : 2
    Points
    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
    Points : 1 051
    Points
    1 051
    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 à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 10
    Points
    10
    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 du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    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
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    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.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 10
    Points
    10
    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?

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 10
    Points
    10
    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

  11. #11
    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
    Points : 3 266
    Points
    3 266
    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.

  12. #12
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par IrmatDen
    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.
    Ok.

    Par précaution j'ai toujours limité l'utilisation de mes vector à une centaine voir un peu plus d'elements et seulement lorsqu'il n'y a pas beaucoup d'ajouts

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok merci à tous.
    Je vais donc modifier toutes mes classes, et les passer à la mode vector!!
    espéront que ça règle une grande partie de mes soucis mémoire

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    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...

  15. #15
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    Par défaut
    En ce moment je bosse sur une map de vecteurs de vecteurs de float et je n'ai aucun probleme en temps d'execution dessus. (Merci Laurent )

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par poukill
    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...
    Ok merci.
    Bon et bien il va falloir que je me plonge dans les doc sur les vector!! car j'en ai jamais utiliser en C++ (mais en java oui)

    Citation Envoyé par ZeRiL
    En ce moment je bosse sur une map de vecteurs de vecteurs de float et je n'ai aucun probleme en temps d'execution dessus. (Merci Laurent )
    C'est rassurant

  17. #17
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Si l'on a un vector de vector d'un objet*. On a 20 lignes et 30 colonnes, par exemple. Comment on insère l'élément [12][14]??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //déclaration
    std::vector<std::vector<objet*>> container;
     
    //insertion
    (container.at(12)).at(14) = new objet();
     
    //utilisation
    std::cout<<container[12][14]->printIt();
    Ou faut il réserver une taille en x et en y dès que l'on connait les dimensions puis faire du push_back tout simplement??

    Dans ce cas comment réserver la taille en x?

    Merci.

    ps: je pense que le mieux est de réserver la taille car dans mon cas j'ai des tableau dont la dimensions y peut varier jusqu'à 50000.

  18. #18
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 69
    Points : 56
    Points
    56
    Par défaut
    L'interet du vector c'est que tu inseres automatiquement en fin, la taille varie automatiquement et tu n'as pas besoin de l'allouer.

    Comment inseres-tu les elements dans ton vector ? tu as des boucles ou tu as juste un objet a un moment donne que tu veux inserer a un endroit precis ?

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par TobyKaos
    Si l'on a un vector de vector d'un objet*. On a 20 lignes et 30 colonnes, par exemple. Comment on insère l'élément [12][14]??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //déclaration
    std::vector<std::vector<objet*>> container;
     
    //insertion
    (container.at(12)).at(14) = new objet();
     
    //utilisation
    std::cout<<container[12][14]->printIt();
    Ou faut il réserver une taille en x et en y dès que l'on connait les dimensions puis faire du push_back tout simplement??

    Dans ce cas comment réserver la taille en x?

    Merci.

    ps: je pense que le mieux est de réserver la taille car dans mon cas j'ai des tableau dont la dimensions y peut varier jusqu'à 50000.
    Affectation, pas de problème avec un vector...
    Par contre, pour une INSERTION, c'est pas le bon conteneur

    -> http://c.developpez.com/faq/cpp/?pag...hoix_conteneur

    Opter plutôt pour une list... ou autre

  20. #20
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 56
    Points
    56
    Par défaut
    Merci j'ai déjà regardé ce schéma. Il en était ressorti que le deque me conviendrai.

    Hors j'en ai pas l'impression.

    Je dois par exemple insérer dans mon tableau à l'endroit container[15][20] et ceux sans plus jamais aller dans les cases d'avant.

    Disons que j'ai une image composé de tuile (64*64 pixels), je ne souhaite charger en mémoire que une partie de mon image, cad une partie de tuiles. genre de 1000 à 2000 en x et 2000 à 5000 en Y ( en pixels).

    Bref avec des tableaux cela marche plutot bien mais je suis limité en mémoire(image de plus 1Go).

    Le problème avec les deque ou les vector est qu'il faut insérer à la suite ou avec la méthode at() mais après avoir alloué la bonne taille.
    Cette dernière me conviens car je peux précalculer la place mémoire qu'il me faut. Mais je ne sais pas comment faire un at().at()

    Est ce clair??
    merci

    edit: une liste de liste ferait peut être l'affaire?

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