Maison >développement back-end >C++ >Comment implémenter des tableaux dynamiques bidimensionnels en C ?

Comment implémenter des tableaux dynamiques bidimensionnels en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-02 18:53:12917parcourir

How to Implement Dynamic Two-Dimensional Arrays in C  ?

Tableaux bidimensionnels dynamiques basés sur les entrées de l'utilisateur

Comprenant la nécessité de tableaux dynamiques lorsque l'on travaille avec des matrices, nous explorons diverses approches pour atteindre cette flexibilité en C.

Vecteur de Vecteurs (vecteur>)

Un vecteur de vecteurs, représentant une matrice, nécessite des classes définies par l'utilisateur pour gérer l'accès aux lignes et aux colonnes. Bien que cette méthode permette des tableaux redimensionnables dynamiquement, elle peut introduire des inefficacités en raison des pointeurs imbriqués et de la surcharge de mémoire.

Modèle de classe Matrix Wrapper

Une approche alternative consiste à créer un classe de modèle qui enveloppe un seul vecteur. Le wrapper garde une trace de la forme de la matrice et fournit des fonctions d'accès :

template <class T>
class matrix {
    int columns_;
    std::vector<T> data;

public:
    matrix(int columns, int rows) : columns_(columns), data(columns * rows) {}

    T& operator()(int column, int row) { return data[row * columns_ + column]; }
};

Cette classe fournit un accès pratique aux indices en utilisant l'opérateur() au lieu de l'opérateur[].

Opérateur de surcharge[ ] pour plusieurs dimensions

Pour ceux qui préfèrent utiliser la syntaxe Operator[], il est possible de la surcharger dans une classe imbriquée structure :

template<class T, int size>
class matrix3 {
    T data[size][size][size];

    friend class proxy;
    friend class proxy2;

    class proxy {
        matrix3& m_;
        int index1_, index2_;
        public:
        proxy(matrix3& m, int i1, int i2) : m_(m), index1_(i1), index2_(i2) {}
        T& operator[](int index3) { return m_.data[index1_][index2_][index3]; }
    };

    class proxy2 {
        matrix3& m_;
        int index_;
        public:
        proxy2(matrix3& m, int d) : m_(m), index_(d) {}
        proxy operator[](int index2) { return proxy(m_, index_, index2); }
    };

public:
    proxy2 operator[](int index) { return proxy2(*this, index); }
};

Cette approche fournit un accès matriciel de style C mais peut nécessiter du code passe-partout.

En comprenant ces options, vous pouvez choisir l'approche la plus appropriée pour vos besoins spécifiques lorsque vous travaillez avec des tableaux dynamiques à deux dimensions dans un contexte matriciel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn