2016-05-16 1 views
0

je tableau à une dimension
Traiter tableau unidimensionnel comme deux dimensions

int* a = new int[n * m]; 

et je dois le traiter comme deux dimensions à savoir

a[i][j] = a[n * i + j] 

J'ai essayé de jouer autour en utilisant des directives et beaucoup googlé. Mais rien n'a marché pour moi.
Y a-t-il un moyen de le faire? Smt. comme define a[i][j] a[n * i + j]?
Merci.

+0

Je pense que vous n'avez pas beaucoup de recherche http://stackoverflow.com/questions/7492842/convert-one-dimensional-arrary-to-two-dimensional-in-c –

+0

N'importe quelle 'array_view', ou la' portée de la GSL 'class, devrait être capable de le faire sans rien changer à propos du tableau lui-même. – chris

+0

Je suppose que vous avez seulement une allocation parce que vous voulez que les données soient contiguës? –

Répondre

1

Puisque vous programmez en C++, vous pouvez créer une enveloppe de classe qui détient le tableau, et ont une fonction operator[] qui retourne un objet proxy dont la fonction operator[] effectue le calcul n * i + j et renvoie une référence à l'élément recherché.

Vous pouvez également créer une fonction inline ou une macro de type fonction qui prend le tableau et les index comme arguments et renvoie l'élément.

Mais sans hacks comme celui de Sams answer des classes wrapper, il n'y a aucun moyen d'obtenir un "vrai" tableau de tableaux comme vous le souhaitez.

2

Vous devez définir un deuxième tableau contenant des pointeurs. Quelque chose comme ceci:

int **b=new int *[m]; 

for (int i=0; i<m; ++i) 
    b[i]=&a[i*n]; 

Après cela, b[i][j] fera référence à a[n*i+j].

+0

Bien qu'il s'agisse d'une solution possible, il y a des problèmes qu'un seul "tableau" ne rencontre pas, principalement en ce qui concerne la localisation et la mise en cache du processeur. –

+0

Je ne veux pas allouer un tableau de pointeurs, puis chaque allocation de mémoire pour chaque pointeur. Je veux juste la substitution 'a [i] [j] = a [n * i + j]' –

+0

@T_Igor Notez que le code dans la réponse ne fait pas réellement ce que vous pensez qu'il fait. La boucle n'alloue pas de mémoire, juste une affectation. –