0
votes

Un moyen facile de créer des tableaux de plusieurs dimensions en C ++ avec le nouvel opérateur

J'ai besoin de créer beaucoup de petits tableaux à 2 dimensions en code C ++. Le problème est que c'est beaucoup de travail à créer même un tableau simple: xxx

existe-t-il un meilleur moyen de faire ça? Je voulais éviter d'écrire "nouveau int [] ..." à chaque fois.


10 commentaires

N'est-il pas correct d'utiliser std :: vecteur au lieu de tableaux?


Une des solutions peut créer une fonction qui prend std :: vecteur et renvoie les tableaux qui représentent le vecteur donné.


Peut-être que vous voulez std :: vecteur > ou std :: Array , 2>


Pouvez-vous allouer sous forme d'énorme tableau un dimensionnel, puis traitez-le comme une matrice en deux dimensions? Cela garderait toutes les valeurs ensemble, au lieu d'avoir un éventail de pointeurs.


Est-il vraiment nécessaire pour vous d'assainir les valeurs au moment où vous les créez? Ou y a-t-il une chance pour vous d'obtenir les valeurs plus tard? Si vous devez assortir des valeurs au moment de la création. Y a-t-il un motif aux valeurs?


Ceci est fait pour la programmation CUDA et je ne voulais pas utiliser STL. Et je voulais aussi traiter est un tableau de matrices.


@Pablochaches En réalité, ces matrices sont utilisées pour une impulsion (celles-ci que je crée sont entrées, puis effectuez des opérations sur eux, puis de la valider).


La programmation CUDA aime avoir ses données dans des endroits séquentiels et contigus. Les processeurs n'aiment pas avoir à recharger leurs caches de données. Les processeurs aiment chercher des données du monde extérieur à peu que possible. Ils doivent être dans leur petit monde privé, exécutant des instructions d'un pipeline ou d'un cache et de récupérer des données d'un cache interne proche.


C'est un moyen très verbeux et inefficace de créer des tableaux, en particulier si elles ont des dimensions fixes. Pourquoi avez-vous choisi cette approche compliquée et allouée dynamique?


Cela a été suggéré par mon conférencier, probablement parce que ces matrices peuvent être très grandes (et si je comprends bien, à l'aide de la matrice de tableaux, nous pouvons contenir plus de valeurs que d'utiliser un tableau unique). Ai-je tort?


3 Réponses :


3
votes

Je recommande d'allouer comme une matrice de dimension unique. Vous pouvez ensuite traiter le tableau 1D en tant que tableau 2D:

int example_array[MAX_ROWS * MAX_COLUMNS] =
{
    /* row 0 */ 1, 2, 3, 4, 5,
    /* row 1 */ 6, 7, 8, 9, 10,
};


4 commentaires

Je connais cette approche mais pour mon cas, j'ai probablement besoin d'utiliser INT **.


La programmation CUDA aime avoir ses données dans des endroits séquentiels et contigus.


Merci, bon à savoir. En fait, j'ai deux implémentations et la seconde fonctionne sur la mise en œuvre de la matrice [M * ​​N]. Mais cela se fait pour certaines choses collégiales et j'ai dû utiliser également une approche avec Int **. C'est pourquoi je voulais savoir s'il y a une meilleure façon de gérer cela.


Les matrices de dimensions fixes sont déjà contiguës, votre complication avec la cartographie de l'index était inutile. Il suffit de déclarer un exemple intemple_array [max_rows] [max_columns] (ou retournez les dimensions si vous aimez)



2
votes

Peut-être que vous pouvez utiliser des boucles imbriquées pour effectuer la tâche xxx

si vous souhaitez assingler les valeurs que vous pouvez le faire directement ici. Mais ils devraient venir d'une fonction de i. Si vous voulez des valeurs vraiment spécifiques, il faudra une tâche manuelle


0 commentaires

4
votes

Si les dimensions ne sont pas décidées au moment de l'exécution et que tous les tableaux intérieurs ont les mêmes dimensions, vous n'avez pas besoin d'une allocation dynamique ici.

Déclarez simplement un tableau: P>

int myArray[2][2] = {
   {9, 9},
   {25, 19}
};


0 commentaires