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 :

Tableau de classes template


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut Tableau de classes template
    Bonjour,

    j'ai une classe qui utilise des templates :
    Code c++ : 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
    18
    19
    20
    21
     
    template <typename T, int dim, typename T2> class myclass
    {
    public:
    	T1 Coordinates[dim] ;
    	T2 Weight ;
     
    myclass()
    	{
    	}
     
    myclass(T1 x, T1 y)
    	{
    	//...
    	}
     
    myclass(T1 x, T1 y, T2 w)
    	{
    	//...
    	}
    }

    Maintenant, je souhaiterai créer un tableau de type myclass, mais chaque entrée sera initialisée avec des éléments différents provenant d'autres tableau... donc quelque chose du genre :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define length 10
    int X[length] ;
    int Y[length] ;
    double W[length] ;
    //... Les tableaux sont remplis de manière aléatoire ou par lecture d'un fichier ...
    myclass<int, 3, double> array[length] ;
    for (int i=0 ; i < length ; i++) array[i] = new Point(X[i], Y[i], W[i]) ;
    Mais si je fais un truc de ce style, je pense que je vais instancier deux fois chaque élément du tableau. Est ce que j'ai tord ?
    Quelle est la bonne façon de faire ?
    Merci par avance !
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    std::vector + std::vector:reserve + std::vector::emplace_back ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<myclass<int, 3, double> > myobjects;
    myobjects.reserve(length);
    for (int i=0 ; i < length ; i++)
    {
        myobjects.emplace_back(X[i], Y[i], W[i]);
    }

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Merci pour la réponse !
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    J'ai une question à propos de la désallocation dans ce cas précis. Comme le tableau "T1 Coordinates[Dimensions]" est static, il sera automatiquement libéré lorsque l'instance de myclass n'existera plus. Donc je n'ai pas besoin de faire quoi que ce soit pour la désallocation de ce vector : le destructor du vector va tenter de désallouer chaque instance (qui ne contiennent que du static).
    Donc rien à faire dans mon cas. Est ce bien cela ?

    Par pure curiosité : qu'elle est la solution en n'utilisant que des tableaux et pas des vector ?
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    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 : 760
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    J'ai une question à propos de la désallocation [...] Donc rien à faire dans mon cas. Est ce bien cela ?
    Oui

    Citation Envoyé par ToTo13 Voir le message
    Par pure curiosité : qu'elle est la solution en n'utilisant que des tableaux et pas des vector ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    auto array = std::apply/*¹*/([](auto&... x) {
      return std::array<myclass<int, 3, double>, sizeof...(x)>{{x, Y[x-X], Z[x-X]}...};
    }, /*tuple_view(*/X/*)*/);
    Les autres solutions sont trop compliquées .

    En réalité, soit tu fais à la main l'initialisation (sans boucle), soit tu déclares un tableau (appel de constructeur par défaut) puis affecte une nouvelle valeur avec une boucle.

    L'utilisation de vector possède aussi un coup et le compilateur ne sera peut-être pas capable d'optimiser emplace_back.
    Le constructeur avec itérateurs est plutôt bon quand le compilateur optimise l'appel au constructeur de copie (quasi obligé avec les itérateur...), mais l'écriture du dit itérateur est une vrai plaie.
    La forme optimal pour vecteur serait un constructeur qui appel n fois une callback avec une façade qui servirait de constructeur pour initialiser la mémoire sans copie (oui, c'est incompréhensible).

    Pour avoir une boucle qui construit un tableau statique de façon optimale, il faudrait le faire à la main et en 2 étapes: un buffer mémoire et une vue sur le buffer qui fait du placement new dans le constructeur et imite l'interface d'un tableau.

    Personne ne veut faire cela ². En plus, le code ne me semble pas critique, inutile de se prendre la tête.


    ¹ http://en.cppreference.com/w/cpp/experimental/apply Mais il faut faire une implémentation de get<I> pour les tableaux c-style ou passer par une vue intermédiaire. Quant-on dit t'utiliser std::array...
    ² TODO: le faire

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    merci !
    Mais la solution simple est quand même un peu tordue ;-)
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/04/2013, 19h29
  2. Tableau de classe utilisant les templates
    Par RaphAstronome dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 22/10/2009, 16h34
  3. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  4. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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