Partage
  • Partager sur Facebook
  • Partager sur Twitter

Initialisation d'array

Sujet résolu
    20 janvier 2023 à 7:15:05

    Bonjour,

    Je ne comprends pas pourquoi cette écriture ne compile pas :

    std::array<std::array<int,3>,3> t {{1,2,3},{4,5,6},{7,8,9}};

    Et encore moins pourquoi celle-ci compile (elle ne devrait pas !):

    std::array<std::array<int,3>,3> t {1,2,3,4,5,6,7,8,9};

    Comment faire pour initialiser facilement des array et array<array> ? Le constructeur est spécifié "implicitly declared".
    (https://en.cppreference.com/w/cpp/container/array)

    -
    Edité par Umbre37 20 janvier 2023 à 7:16:25

    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2023 à 7:42:52

      Je connais pas les details, mais array utilise pas de initializer-list constructor dans cette syntaxe mais les aggregate initialization https://en.cppreference.com/w/cpp/language/aggregate_initialization 

      Pour ton 2eme code, c'est de la "brace elision" (mais clang met un warning sur ton code, a priori tu devrais avoir un = pour que la brace elision soit acceptee)

      Pour le premier code, il faut ajouter des {}

      std::array<std::array<int,3>,3> t {{{1,2,3},{4,5,6},{7,8,9}}};

      La raison...

      Juste copie-colle les syntaxes de cppreference 

      -
      Edité par gbdivers 20 janvier 2023 à 7:43:54

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2023 à 8:24:23

        @gbdivers

        Merci beaucoup ! effectivement je ne connais pas les subtilités des "aggregate initialization", "brace elision"... je suis passé à côté.

        Je n'ai pas d'erreur avec clang, mais je n'avais pas activé d'option de warning en particulier. Avec -Wall j'en ai une effectivement...

        Du coup quelle est la différence de logique entre ces deux lignes ? (trouvées sur le lien que tu as donné).

        std::array<int, 3> std_ar2{{1, 2, 3}};  // std::array is an aggregate
        std::array<int, 3> std_ar1 = {1, 2, 3}; // brace-elision okay

        -
        Edité par Umbre37 20 janvier 2023 à 8:25:59

        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2023 à 8:37:17

          D'une manière général c'est de toute façon pas très élégant d'avoir un tableau de tableau ormis le fait de pouvoir facilement faire tab[r][c], la plupart du temps on préferera utiliser un tableau linéarisé.
          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            20 janvier 2023 à 10:08:59

            Umbre37 a écrit:

            Du coup quelle est la différence de logique entre ces deux lignes ? (trouvées sur le lien que tu as donné).

            Ces 2 syntaxes sont equivalentes :
            std::array<int, 3> std_ar2 = {{1, 2, 3}};  // std::array is an aggregate
            std::array<int, 3> std_ar2   {{1, 2, 3}};  // std::array is an aggregate

            La 3eme est la meme avec le signe = et avec la brace elision

            std::array<int, 3> std_ar2 = {1, 2, 3};

            markand a écrit:

            D'une manière général c'est de toute façon pas très élégant d'avoir un tableau de tableau ormis le fait de pouvoir facilement faire tab[r][c], la plupart du temps on préferera utiliser un tableau linéarisé.

            Bof pour l'elegance. On linearise surtout pour les tableaux dynamiques, parce que sinon les donnees sont pas contigues en memoire (perte de performance avec les cache miss), mais pour des tableaux statiques, c'est osef. Et ca permet d'utiliser [i][k] plutot que (i,j) ou [i*N+j].




            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2023 à 16:33:32

              Merci de ta réponse ! Bonne soirée.
              • Partager sur Facebook
              • Partager sur Twitter

              Initialisation d'array

              × 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