Partage
  • Partager sur Facebook
  • Partager sur Twitter

vector<char[2]>

problème d'allocation

Sujet résolu
    6 mars 2008 à 18:27:25

    Bonjour,
    suite à une question posée en c (http://www.siteduzero.com/forum-83-249337-char-c-2-char-2-malloc-2-sizeof-char.html), je me demandais, bêtement, comment on pouvait allouer des éléments à
    1. std::vector<char[2]> * vecteur=new std::vector<char[2]>;


    Mes essais :
    1. #include<vector>
    2. int main(){
    3.         std::vector<char[2]> * vecteur=new std::vector<char[2]>;
    4.         char * c=(char*)malloc(2*sizeof(char));
    5.         //char c[2];//Commenter cette ligne ou la précédente si vous voulez essayer
    6.         *c='a';
    7.         *(c+1)='\0';
    8.         vecteur->push_back(c);// <- plante ici
    9. }


    Ca me laisse perplexe.
    • Partager sur Facebook
    • Partager sur Twitter
      6 mars 2008 à 20:27:13

      Pourquoi faire un new sur le vector ?
      Pourquoi utiliser des char[2] ? string ou std::pair<char,char> sont mieux.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        6 mars 2008 à 20:53:00

        Utilise std::string tu te prendras moins la tête je pense :) .
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          6 mars 2008 à 21:00:06

          vector<char[2]> na aucun sens.
          std::vector<typename _Tp, typename _Alloc = std::allocator<_Tp> > attend en 1er paramètre un type (POD ou non) et en 2eme paramètre un allocateur (qui à une valeur par defaut).

          Or char[2] n'est pas un type.
          Ca ne peut donc pas compiler.

          Comme la dit RaptorTeak, je te conseile d'utiliser des std::string pour manier des chaines de caractères.
          • Partager sur Facebook
          • Partager sur Twitter
            6 mars 2008 à 21:10:59

            Merci de m'avoir répondu.
            Je voudrais un programme très rapide, donc string est éliminé, car les caractères peuvent être stockés de façon non-contigüe. Par contre, (char,char) est peut-être meilleur pour les performances que ma proposition, qui contient une indirection(pointeur).

            Merci pour ces précisions Davidbrcz, j'étais troublé par le fait que le compilateur accepte la déclaration. S'il l'autorise, c'est juste dans le cas où je réecrirais l'allocateur, si j'ai bien compris.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              6 mars 2008 à 21:34:58

              En effet, std::string ne garantie rien sur la contionuité.
              Par contre les conteneurs séquentiels(vector,...) garantisse ceci en 23.1.1:§1

              Citation : Norme

              A sequence is a kind of container that organizes a finite set of objects, all of the same type, into a strictly linear arrangement.


              • Partager sur Facebook
              • Partager sur Twitter
                6 mars 2008 à 21:49:54

                Je crois que tout a été dit. Merci de m'avoir aidé.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  6 mars 2008 à 22:04:12

                  Le seul inconvénient avec l'utilisation des vector & co, c'est que tout perd toute l'interface de std::string et ses facilité.
                  Donc, soit tu t'en fout et dans ce cas, c'est pas génant, soit tu en as 'besoin' et tu peux (doit) alors la recoder (bonjours le boulot).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 mars 2008 à 8:19:54

                    Excusez-moi, mais pouvez-vous éclairer ma lanterne sur le caractère "non-contigü" des std::string ? Je ne sais absolument pas ce que ça signifie ^^ .
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 mars 2008 à 9:07:25

                      Avec les chaînes C tu as ceci:
                      Image utilisateur
                      Avec les std::string les adresses ne se suivent pas
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 mars 2008 à 10:36:49

                        La norme avait été écrite en laissant à std::string la possibilité d'être implémentée comme une std::deque par exemple. C'est à dire une liste de buffers (où à l'intérieur tout est contigü).

                        Dans les faits toutes les implémentations de std::string vérifient la contigüité (&ch[0]+N == &ch[N]), et comme pour les vecteurs en 2003 (ou 01?) cet état de fait devrait être entériné dans le prochain standard si j'ai bien suivi.

                        Sinon, la performance n'est pas plus importante que les fuites de mémoire. Et je ne serai pas surpris que sur les bons couples compilo+SL un std::vector<string> soit plus rapide que ton std::vector<char *> -- certaines implémentations de std::string ne font pas d'allocation dynamique pour les petites chaines.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                        vector<char[2]>

                        × 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