Partage
  • Partager sur Facebook
  • Partager sur Twitter

Assigner contenu vector par autre sans copie

    7 novembre 2018 à 9:49:37

    Salut à tous!

    Alors voilà, j'ai un vector de points3D, et je voudrais utiliser PCL pour appliquer des filtres sur ce vecteur de points.

    Pour pouvoir appliquer un filtre, il faut que j'utilise un arbre PCL, et dans cet arbre PCL il y a un vector de points justement.
    Comme il y a un certain nombre de données j'aimerai bien ne pas avoir à faire de copie, juste assigner au vector de l'arbre le vector déjà créé (et si je fais des modifications dans l'arbre, que le vecteur de points soit modifié en même temps).

    pour donner l'exemple :

    std::vector<MyPoints> vec; //le vecteur vec contient des données que j'ai récupérer d'un fichier.
    
    
    void foo(){
        pcl::PointCloud<MyPoint>::Ptr cloud;
        //cloud contient une donnée "points" qui est un std::vector<MyPoints>
        
    
        //Si je fais 
        cloud->points = vec;
        //j'ai l'erreur : "aucun opérateur "=" ne correspond à ces opérandes. Les types d'opérandes sont : 
        //std::vector<MyPoint, Eigen::aligned_allocator<MyPoint>> = std::vector<MyPoint, std::allocator<MyPoint>>
    
        //J'aimerais faire quelque chose du genre
        &cloud->points[0] = &vec[0];
        //mais &cloud->points[0] "doit être une expression modifiable"

    //et il me semble que vector.assign crée une copie
     }
    
    
    
    Il y aurait un moyen de faire ce que je veux faire?

    Merci beaucoup! :)

    -
    Edité par KirbXCoucou 7 novembre 2018 à 10:16:13

    • Partager sur Facebook
    • Partager sur Twitter

    « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
    D. Mendeleïev

      7 novembre 2018 à 15:31:33

      Salut,

      Pour répondre simplement à la problématique résumée dans le titre :

      => Constructeur par déplacement : https://akrzemi1.developpez.com/tutoriels/c /constructeur-par-deplacement/

      -
      Edité par CeBiM 7 novembre 2018 à 15:31:46

      • Partager sur Facebook
      • Partager sur Twitter
      Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
        7 novembre 2018 à 16:10:00

        Bonjour,

        Tu as swap qui te permet cela pour les conteneurs.

        vector<double> a(8,3.14);  //Un vector contenant 8 fois le nombre 3.14
        
        vector<double> b(5,2.71);  //Un autre vector contenant 5 fois le nombre 2.71
        
        
        a.swap(b); //On échange le contenu des deux tableaux. 
        
        //b a maintenant une taille de 8 et a une taille de 5.

        source :

        https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c/1903098-les-conteneurs

        -
        Edité par pseudo-simple 7 novembre 2018 à 16:18:11

        • Partager sur Facebook
        • Partager sur Twitter
          7 novembre 2018 à 16:25:01

          Salut,

          La solution pour ne pas faire de copie est l'affectation par mouvement

          cloud->points = std::move(vec)


          Mais comme pour la copie, il faut que l'allocateur le permette, et je connais pas Eigen, apparemment tu peux voir si c'est le cas avec std::allocator_traits, les propriétés propagate_on_container_(.*)_assignement

          Mais si tu es dans le cas de ton exemple, utiliser le déplacement sur vec est une mauvaise idée car il a une portée supérieure à cette fonction et donc peut-être utilisé de manière invalide ailleurs

          • Partager sur Facebook
          • Partager sur Twitter
          Dream on, Dream on, Dream until your dream comes true
            7 novembre 2018 à 16:42:32

            Une simple référence, ou std::shared_ptr ne pourrais pas faire l'affaire ?
            • Partager sur Facebook
            • Partager sur Twitter
              8 novembre 2018 à 8:31:32

              CeBIM : Malheureusement, il n'existe pas de constructeur par déplacement pour le PointCloud de PCL, et le vector est crée en même temps que l'arbre. Il faut donc que j'utilise un déplacement plutôt qu'un constructeur.

              Yes Man: Merci de la réponse, mais tout comme l'égalité, le swap ne marche pas car les allocator ne sont pas les mêmes.

              romantik : je vais regarder ça, mais il semble impossible d'utiliser le std::move dans mon cas, les allocators semblent ne pas l'accepter. Je vais regarder allocator_traits pour avoir un peu plus d'informations.
              Et non, je ne suis pas dans ce cas là reellement, la portée des 2 vectors est la même, c'était juste pour donner un truc minimaliste :)

              Deedolith : Je suis peut-être fatigué, mais je ne comprends pas :'(

              • Partager sur Facebook
              • Partager sur Twitter

              « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
              D. Mendeleïev

                8 novembre 2018 à 9:23:14

                Pas sûr de ce que j'ai dit par rapport aux propriétés :s

                Par contre en m'inspirant de ce SO, le plus proche de ce que tu souhaites faire semble être un truc comme ça

                    std::vector< int, Mallocator<int> > myvec = {1, 2, 3};
                    std::vector< int > othervec = {4, 5, 6};
                    
                    for(const auto & e : myvec)
                        std::cout << e << " ";
                    std::cout << std::endl;
                    
                    myvec = decltype(myvec)(
                        std::make_move_iterator(std::begin(othervec)),
                        std::make_move_iterator(std::end(othervec))
                    );
                        
                    for(const auto & e : myvec)
                        std::cout << e << " ";
                    std::cout << std::endl;



                • Partager sur Facebook
                • Partager sur Twitter
                Dream on, Dream on, Dream until your dream comes true
                  8 novembre 2018 à 9:23:15

                  Lu'!

                  Pourquoi ne pas simplement créer ton vector directement avec un type Eigen puisque c'est ce que l'outil attend ?

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                    8 novembre 2018 à 9:35:04

                    KirbXCoucou a écrit:

                    Deedolith : Je suis peut-être fatigué, mais je ne comprends pas :'(

                    Pourtant c'est simple:
                    Quand on veux éviter de faire des copies inutiles, les premiers réflexes sont les références ou les pointeurs (intelligents).

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 novembre 2018 à 9:43:15

                      Deedolith a écrit:

                      Pourtant c'est simple:

                      Quand on veux éviter de faire des copies inutiles, les premiers réflexes sont les références ou les pointeurs (intelligents).


                      Je crois pas qu'il aie la main sur pcl::PointCloud<MyPoint>::Ptr donc sur le type de cloud->points
                      PCL est une lib n'est-ce pas ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Dream on, Dream on, Dream until your dream comes true
                        8 novembre 2018 à 9:43:38

                        Re!
                        Bon, finalement, j'avais vraiment trop la tête dans le guidon depuis le début de la semaine et je me suis forcé à me créer un problème qui n'avait pas lieu d'être... Donc j'ai sauvegarder mes points directement dans un pcl::PointCloud plutôt que de passer par un vector, parceque toutes ces données n'auront pas de vocations autre que d'être utilisées au sein de PCL, donc pas la peine de m'embêter. (ça rejoint un peu ce que tu as dis ksass peuk)
                        romantik : ça reste très interessant pour des vrais problèmes futurs, je vais y jeter un oeil, merci beaucoup!
                        Deedolith : Je suis d'accord, mais comment l'appliquer dans mon cas là? Ca reviendrait a faire ça non?
                        &cloud->points[0] = &vec[0];
                        Mais ça ne marchais pas car les 2 vectors n'avait pas le même type d'allocator
                        • Partager sur Facebook
                        • Partager sur Twitter

                        « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                        D. Mendeleïev

                        Assigner contenu vector par autre sans copie

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown