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 :

Vecteur de vecteur de vecteur ?


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Vecteur de vecteur de vecteur ?
    Hello,

    Il y a moyen d'éviter de créer un tel monstre ? Et est-ce vraiment un montre ?
    Existe-t-il une structure de données (Boost ?) pour cela ?

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    1. oui, en utilisant un vecteur simple et en calculant l'index avec une fonction du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T at(x, ,y, z) { return data[x+y*xdim+z*xdim*ydim); }
    2. oui, c'est un monstre
    3. oui, boost multi array

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Bonjour

    1. oui, en utilisant un vecteur simple et en calculant l'index avec une fonction du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T at(x, ,y, z) { return data[x+y*xdim+z*xdim*ydim); }
    2. oui, c'est un monstre
    3. oui, boost multi array
    1. Dans ce cas là, autant se passer du vecteur pour la 1ère dimension, et passer directement en pointeurs. :-)
    2. Faudra que je el mette de côté pour Halloween.
    3. Apparemment, il n'y a pas moyen de faire croître le tableau comme avec un push_back().

  4. #4
    screetch
    Invité(e)
    Par défaut
    tu y es arrivé comment pour avoir besoin de ce genre de structure de stockage?
    ca pourrait venir d'un problème de conception bien plus haut, et peut-être l'intervention chirurgicale (boost::multi_array) n'est pas le plus efficace; peut-être repensé au problème dans sa globalité pour comprendre pourquoi tu as besoin d'une structure aussi compliquée.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Parce que je récupère des données d'une base de données, que je dois faire pour chacun des éléments des calculs à la noix qui dépendent des autres données, qui finissent elles-même par être mises à jour par ledit calcul, et que que je ne peux sans arrêt faire des lectures/écritures dans la base de données.

  6. #6
    screetch
    Invité(e)
    Par défaut
    je ne suis pas sur de saisir le problème en entier mais am on avis, tu n'as pas reellement cerné le problème et divisé en parties "manageable": le problème est trop compliqué a résoudre et donc tu dois passer par des structures compliquées.

    Je dirai que le problème est la, pas dans le vector de vector de vector

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je te rejoins sur le diagnostic. :-)

    En fait, je dois boucler sur des jours et des heures.
    Les jours et les heures peuvent tous deux être au tarif plein ou creux.
    Une troisième dimension (non temporelle) vient s'ajotuer à cela.

    Je dois effectuer des opérations (moyennes pondérées, etc.) prenant en compte les jours/heures/[3ème paramètre] du même type.

    Comment faire ? Graphe ?...

    En fait, je dois reproduire une base de données, avec des requêtes du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * WHERE critère_1, critère_2, critère_3

  8. #8
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    ok genre donc une structure avec trois champs et non pas un tableau 3D

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Oui, sauf que n'ayant pas de mécanisme de sélection en fonction du contenu de ces champs, il me semblait que la meilleure méthode était d'utiliser des indices de tableaux.

  10. #10
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    boost::multi_index (je sais pas ce que j'ai avec boost en ce moment )

    Sinon, il suffit de fournir les foncteurs adéquates pour travailler sur le(s) critère(s) qui t’intéresse (ou mieux, utiliser les lambdas).

    EDIT :
    si les performance sont critiques, peut être qu'il est possible d'utiliser des map pour les critères (peut être que c'est ce que fait boost::multi_index) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::vector<Data> data;
    typedef std::vector<Data>::iterator iterator;
    map<critère1, iterator> c1;
    map<critère2, iterator> c2;
    map<critère3, iterator> c3;
     
    void add(critère1, critère2, critère3, data)
    {
       data.push_back(data);
       c1.insert(make_pair(critère1, data.end()-1);
       c2.insert(make_pair(critère2, data.end()-1);
       c3.insert(make_pair(critère3, data.end()-1);
    }
    c'est peut être un peu tordu (et le coût de création sera très important)

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je suis parti sur une solution très tordue à base de map. Pour créer la clé, je me sers de mes trois variables pour cnstituer un entier: une pour les centaines, une pour les dizaines, et une pour les unités. :-)

    En valeur, j'ai un vecteur de tous les objets qui répondent aux trois critères.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par gbdivers Voir le message
    boost::multi_index (je sais pas ce que j'ai avec boost en ce moment )

    Sinon, il suffit de fournir les foncteurs adéquates pour travailler sur le(s) critère(s) qui t’intéresse (ou mieux, utiliser les lambdas).

    EDIT :
    si les performance sont critiques, peut être qu'il est possible d'utiliser des map pour les critères (peut être que c'est ce que fait boost::multi_index) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::vector<Data> data;
    typedef std::vector<Data>::iterator iterator;
    map<critère1, iterator> c1;
    map<critère2, iterator> c2;
    map<critère3, iterator> c3;
     
    void add(critère1, critère2, critère3, data)
    {
       data.push_back(data);
       c1.insert(make_pair(critère1, data.end()-1);
       c2.insert(make_pair(critère2, data.end()-1);
       c3.insert(make_pair(critère3, data.end()-1);
    }
    c'est peut être un peu tordu (et le coût de création sera très important)
    Puisqu'on en est avec boost, autant construire l'itérateur ad-hoc avec Boost.iterator pour aller chercher le champ qui t'intéresse.

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Joel F Voir le message
    ok genre donc une structure avec trois champs et non pas un tableau 3D
    Je dirais même plus : il y a de forte chance que le tableau 3D soit presque vide, ce qui tendrait à monter qu'il n'est pas la bonne solution (si l'OP a 100 éléments à mettre dans un tableau de 10x10x10, alors celui-ci est vide à 90%).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    D'où mon utilisation, au final, d'un map à base d'un entier reconstitué.
    Conceptuellement, il eût fallu un tuple, mais la recherche dans le map aurait été moins efficace (je pense).

  15. #15
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Citation Envoyé par oodini Voir le message
    En fait, je dois reproduire une base de données, avec des requêtes du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * WHERE critère_1, critère_2, critère_3
    Ca ne fait que du 2D là, pas du 3D, donc un vecteur de vecteur ?
    Raphchar.

  16. #16
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Pourquoi ne pas tout simplement faire une structure avec tes trois données, et t'amuser avec les foncteurs qui vont bien

    La structure serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struc Data
    {
        int valeur1_;
        int valeur2_;
        int valeur3_;
    };
    que tu placerais dans un vecteur simple (std::vector<Data> )

    et tu aurais une "batterie" de foncteurs correspondant à tes différents besoins :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    struct less
    {
        bool operator ()(Data const & first, Data const & second) const
        {
            return first.valeur1_ < second.valeur1 ||
     
                   (first.valeur1_ == second.valeur1_ && 
                     first.valeur2_<second.valeur2_) ||
     
                   (first.valeur1_ == second.valeur1_ && 
                     first.valeur2_<second.valeur2_ &&
                      first.valeur3_<second.valeur3_ );
        }
    };
    struc secondLess
    {
        bool operator ()(Data const & first, Data const & second) const
        {
            return first.valeur1_ < second.valeur1 ||
     
                   first.valeur2_<second.valeur2_ ||
     
                   first.valeur3_<second.valeur3_ ;
        }
    }
     
    struc onlyValue1
    {
        bool operator ()(Data const & first, Data const & second) const
        {
            return first.valeur1_ < second.valeur1  ;
        }
    };
    /*  ... */
    tu remplis ton vecteur une bonne fois pour toutes, puis tu le tries sur base de tes besoins (en essayant de faire en sorte de regrouper les utilisations des différents tris )

    Dans le pire des cas, il suffira de rajouter un foncteur pour LE cas particulier de tri auquel tu n'auras pas pensé quand tes manipulations deviendront plus complexes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Quel serait l'intérêt de cette méthode par rapport au map ?

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Le principal intérêt serait que tu n'aurais besoin que d'un seul vecteur, que tu tries "à la demande", alors qu'avec les map, tu serais obligé de le copier à chaque fois que tu veux faire un tri différent

    En effet, il ne me semble pas qu'il soit possible de changer le foncteur de tri une fois que la map existe

    Si tu as de nombreux enregistrements, cela peut te faire économiser pas mal de mémoire, sans compter que le tri est * peut etre * plus rapide dans cet ordre que s'il faut à chaque fois recopier l'intégralité de la map

    Et surtout, c'est "simplement" plus facile, car tu peux manipuler des itérateurs "simple" et non des itérateur composés de paires
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je n'ai pas besoin d'un ordre de tri particulier, et je ne vois pas en quoi j'économiserais de la mémoire, car la clé serait dans le vecteur plutôt que dans le map.

    Le seul argument serait celui relatif à la manipulation des paires (honni soit qui mâle y pense). Mais je ne le trouve pas si critique.

    Je trouve que l'utilisation des map est en outre plus conforme à une conception intuitive de ce qu'il faut coder.

  20. #20
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Tu peux créer ta structure et t'en servir de clé pour une map, pour peu que tu aies implémenté les bons foncteurs dessus. Ca t'évite la magouille de reconstitution d'entier et ça ne sera pas particulièrement moins efficace. Par contre faut bien choisir ta structure avant de te taper l'implémentation des foncteurs et des itérateurs.
    Find me on github

Discussions similaires

  1. chercher un vecteur dans un autre vecteur.
    Par etudiante-m dans le forum MATLAB
    Réponses: 1
    Dernier message: 16/01/2013, 12h42
  2. Vecteur de reference ou Vecteur ?
    Par ADBows dans le forum Débuter
    Réponses: 2
    Dernier message: 13/12/2011, 23h40
  3. vecteur de une colonne ->vecteur à 2 colonnes
    Par Orel01 dans le forum MATLAB
    Réponses: 4
    Dernier message: 02/12/2009, 08h35
  4. Nombre d'occurrence d'un vecteur dans un autre vecteur
    Par FstDsi dans le forum Débuter
    Réponses: 1
    Dernier message: 09/08/2009, 16h45
  5. Décomposer un vecteur en 'n' sous vecteurs
    Par Medoou dans le forum MATLAB
    Réponses: 6
    Dernier message: 21/07/2009, 20h35

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