1
votes

Utiliser l'opérateur [] [] avec des vecteurs?

J'ai créé un vecteur unidimensionnel de int, comment puis-je le traiter comme un vecteur bidimensionnel?

Bien que je puisse écrire arr [1]; Je ne peux pas écrire arr[1[1[2[2. );

Pourquoi j'ai besoin de ceci: Au lieu de définir un vecteur de vecteurs [3x5] j'ai défini un vecteur dont la longueur est de 15, donc chaque fois que j'ai une fonction qui prend les coordinations d'une place dans la matrice, je dois appeler une autre fonction qui les convertit en une valeur dimensionnelle, qui est vraiment ennuyeux.


9 commentaires

Je ne sais pas ce que tu veux dire. Pourquoi voulez-vous accéder à un vecteur 1D comme c'est 2D?


oui exactement @cigien


parce que j'étais censé le définir comme une matrice mais pour l'efficacité j'ai utilisé un vecteur unidimensionnel


au lieu d'utiliser un vecteur de vecteurs


Veuillez ajouter toutes ces informations à la question, au lieu de les ajouter sous forme de commentaires. Essayez également d'expliquer ce que vous entendez par code, au lieu de le décrire.


a mis à jour mon message @cigien


Ce ne sera pas une solution facile, car l'efficacité rend parfois le travail de codage plus difficile. Vous devrez traiter un tableau / vecteur unidimensionnel comme bidimensionnel, uniquement dans votre algorithme. par exemple. dans votre cas, au lieu de arr [1] [2] , vous écrirez arr [1 * 5 + 2] .


Vous pouvez traiter un tableau 1D comme N dimensions en utilisant l'adressage, ou pour 2D: arr [x + y * w] w est la "largeur" ​​du y dimension. Vous pouvez utiliser std::vector> si vous voulez un tableau 2D réel.


Ce n'est pas (tout à fait) une question en double, mais la réponse que j'ai écrite à une question précédente le couvre néanmoins assez bien.


3 Réponses :


3
votes

En supposant que vous vouliez traiter un tableau 1D de taille N comme un tableau 2D avec des colonnes M , vous pouvez alors écrire une fonction d'assistance qui calcule l'index 1D donné en 2D index:

arr[in(i,j)];

puis utilisez-le comme ceci:

auto in = [M] (int i, int j) { return i * M + j; };

C'est au moins préférable de dire arr [i * M + j] partout, ce qui est sujet aux erreurs.

Idéalement, vous envelopperiez ce tableau 1D dans une classe qui prend en charge l'indexation 2D.


0 commentaires

0
votes

Il me semble que la meilleure solution est d'éviter du tout le double opérateur [] et de définir une fonction at () qui reçoit deux index.

Quoi qu'il en soit , si vous voulez vraiment (vraiment!) une solution double opérateur [] , le premier doit renvoyer un objet avec les données demandées et prendre en charge le deuxième opérateur [] p>

Je propose l'exemple squelettique suivant, où un arr2d (avec une dimension connue au moment de la compilation) est basé sur un std :: array mono-dimensionnel. p>

T & at (std::size_t i1, std::size_t i2)
 { return arr[i1*Dim1 + i2]; }

T const & at (std::size_t i1, std::size_t i2) const
 { return arr[i1*Dim1 + i2]; }

Comme vous pouvez le voir, arr2d :: operator [] renvoie un objet foo contenant une référence au std :: array et au premier index.

foo :: operator [] termine le travail, renvoyant une référence ( ou une référence constante, selon le cas) à l'élément de droite à l'intérieur du std::array.

Mais, je répète: je préfère quelques à ( ) fonctions dans Arr2d

XXX


2 commentaires

Un std :: array imbriqué pourrait être utilisé à la place de struct foo .


@HolyBlackCat - Voulez-vous dire un std :: array , Dim1> ? Oui; et c'est une solution plus simple et (je suppose) meilleure. Mais je suppose aussi que l'OP veut un double opérateur [] sur un seul tableau de données.



0
votes

L'utilisation de l'opérateur virgule était obsolète entre crochets avec C ++ 20. Cela permettra à l'avenir d'écrire quelque chose comme m [i, j] pour l'accès à la matrice.

Jusque-là, votre seule chance est d'utiliser une fonction membre comme à .

Une approche intelligente et déconseillée consiste à demander à operator [] de renvoyer une sorte de proxy row qui a un opérateur [] sur son propre pour effectuer l'indexation. Cela est affiché ici .

Notez que stocker le row_proxy peut conduire à des pointeurs suspendus, c'est pourquoi operator [] n'est implémenté que pour les références rvalue.


0 commentaires