HOWTO · C++
Déclarer un tableau de vecteurs dans C++ STL
Cet article présente comment déclarer un tableau de vecteurs en C++
Sur cette page
Ce guide explique comment déclarer, en C++, soit un nombre fixe de vecteurs, soit un vecteur de vecteurs redimensionnable. Le conteneur externe détermine le nombre de lignes que vous pouvez ajouter ; chaque std::vector interne détermine le nombre de valeurs contenues dans cette ligne. Choisissez la première forme si le nombre de lignes est fixe, et la seconde si la collection externe doit pouvoir grandir ou rétrécir.
Choisir entre un tableau fixe et un vecteur de vecteurs
Un tableau de vecteurs possède un nombre de lignes fixé à la compilation, tandis que chaque ligne reste un vecteur qui peut grandir indépendamment. Un vecteur de vecteurs peut aussi changer le nombre de ses lignes, et celles-ci peuvent avoir des longueurs différentes. Un vecteur de vecteurs ne forme donc pas nécessairement une matrice rectangulaire. Cette structure convient notamment aux listes d’adjacence, où chaque élément peut avoir un nombre différent de voisins.
Dans les deux formes, les vecteurs sont des éléments du conteneur et gèrent donc leur propre mémoire. Aucune des deux déclarations ne garantit que chaque ligne contient le même nombre de valeurs. Si votre algorithme exige une forme rectangulaire, initialisez toutes les lignes avec la même largeur et maintenez cette règle lorsque vous modifiez les données.
Déclarer un tableau de vecteurs avec la syntaxe de tableau de style C
Pour obtenir un nombre fixe de lignes, déclarez un tableau dont le type d’élément est std::vector<int>, par exemple std::vector<int> rows[3];. Le tableau contient trois vecteurs. Ceux-ci sont initialement vides, mais vous pouvez ajouter des valeurs à une ligne avec rows[0].push_back(10). Le tableau lui-même ne peut pas accueillir un quatrième vecteur ; utilisez un conteneur externe redimensionnable si le nombre de lignes doit pouvoir changer.
Cette syntaxe est utile lorsque le nombre de lignes fait partie de la structure fixe du programme. La taille du tableau est déterminée par sa déclaration, tandis que la taille de chaque vecteur peut varier pendant l’exécution du programme. Les deux dimensions obéissent donc à des règles différentes : le tableau externe est fixe, et les vecteurs internes sont redimensionnables.
Déclarer un vecteur de vecteurs redimensionnable
Utilisez std::vector<std::vector<int>> lorsque le nombre de lignes doit pouvoir varier. Une liste d’initialisation peut créer des lignes de longueurs initiales différentes. Vous pouvez aussi écrire std::vector<std::vector<int>> rows(3, std::vector<int>(2, 0)); pour créer trois lignes contenant chacune deux zéros. Dans cette forme de constructeur, le premier argument indique le nombre de lignes ; le second est un vecteur copié pour initialiser chacune d’elles.
Vous pouvez ajouter une nouvelle ligne avec rows.push_back({8, 9}) ou ajouter une valeur à une ligne existante avec rows[0].push_back(7). Agrandir ou réduire une ligne ne redimensionne pas automatiquement les autres. Choisissez la forme avec constructeur pour créer une grille initiale régulière, et une liste d’initialisation ou une construction ligne par ligne lorsque les longueurs diffèrent.
Accéder à un vecteur de vecteurs et le parcourir
Utilisez rows[row][column] pour accéder directement à un élément lorsque vous savez que les indices sont valides. Chaque indice s’applique à un vecteur différent : le premier sélectionne une ligne externe, et le second une valeur dans cette ligne. Comme les lignes peuvent avoir des longueurs différentes, un indice de colonne valide pour l’une peut ne pas l’être pour une autre.
Utilisez rows.at(row).at(column) pour vérifier les limites lors de l’accès ; at() signale un accès hors limites au lieu de laisser l’indexation dépasser silencieusement la taille du vecteur sélectionné. Pour parcourir toutes les valeurs sans supposer que les lignes ont la même longueur, utilisez des boucles imbriquées fondées sur les plages. Dans la boucle interne, liez la valeur par référence (int& value) si vous souhaitez modifier les éléments stockés ; pour une lecture seule, utilisez une valeur ou une référence constante. L’exemple complet ci-dessous présente les deux formes de déclaration, l’indexation, l’accès avec vérification des limites, l’ajout d’éléments et la modification des valeurs par référence.
Ce programme complet présente les deux formes de conteneur et accède à leurs valeurs :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
#include <iostream>
#include <vector>
int main() {
std::vector<int> fixed_rows[3] = {{1, 2}, {3}, {4, 5, 6}};
std::vector<std::vector<int>> rows{{1, 2}, {3}, {4, 5, 6}};
fixed_rows[0].push_back(7);
rows.push_back({8, 9});
rows[1].push_back(7);
rows.at(0).at(1) = 20;
std::cout << fixed_rows[0][2] << '\n';
std::cout << rows.at(0).at(1) << '\n';
for (auto& row : rows) {
for (int& value : row) {
value *= 2;
std::cout << value << ' ';
}
std::cout << '\n';
}
}