▶︎ C04 - Tableaux et vecteurs

Programmation C++

BTS CIEL Informatique et Réseaux

Lycée Louis Rascol, Albi




Release : v1.0 (23.09.23)
📧 joris.serrand@rascol.net
🐙 Github : ciel-ir-rascol/cpp-cours

▶︎ C03 - Variables et Constantes

Qu'est ce qu'un tableau en C++ ?

  • Un type de donnée composé ou structure de données
    • C'est une collection d'éléments
    • Tous les éléments sont du même type
  • On peut accéder à chaque élément directement
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Mais pourquoi aurions nous besoin d'un tableau ?

Exemple d'un stockage de notes

Nous souhaitons stocker en mémoire les notes de 5 évaluations de Maths, sans tableau on devrait faire :

float evalMaths1{10.5};
float evalMaths2{12};
float evalMaths3{13};
float evalMaths4{20};
float evalMaths5{9.25};

Imaginez la gestion des notes pour 10, voir 100 variables, ça peut vite devenir fastidieux 🤯

Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

- Les tableaux statiques -

Arrays

Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Caractéristiques d'un tableau statique

  • Sa taille est fixe
  • Ses éléments sont tous du même type
  • Il est stocké de manière continue en mémoire
  • Ses éléments peuvent être accessibles par leur index
  • Le premier élément est à l'index 0, le dernier à taille-1
  • ‼️ Pas de contrôle de dépassement
  • ‼️ Toujours penser à initialiser un tableau
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Déclarer un tableau statique

▶︎ Syntaxe

type_des_elements nom_tableau [nombre_elements];

▶︎ Exemples

float evalsMaths [5]; // Déclaration d'un tableau de 5 réels

const int nbJoursAn {365}; // Déclaration d'une constante entière
double hautesTemps [nbJoursAn]; // Déclaration d'un tableau de réels de 365 cases

// ⛔ À NE PAS FAIRE !
int nbJoursSemaine {7}; // Déclaration d'une variable 
int nbTachesJour [nbJoursSemaine]; // 🔴 ERREUR on initialise pas un tab avec une var
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Initialiser un tableau statique

▶︎ Syntaxe

type_des_elements nom_tableau [nombre_elements] {liste_init};

▶︎ Exemples

// Initialisation des 5 cases
float notesEvals [5] {10.5,12,13,20,9.25};

// Initialisation des 365 cases à 0
int hautesTemps [365] {0};

// Taille du tableau en fonction de l'initialisation , ici 4 cases
int unDernierTableau [] {1,2,3,4};
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Accès aux éléments d'un tableau statique

▶︎ Syntaxe

nom_du_tableau [index_de_l_element]

▶︎ Exemples

float notesEvals [5] {10.5,12,13,20,9.25};

cout << "Première note à l'index 0 : "<< notes[0] << endl;
// 🖥 Première note à l'index 0 : 10.5
cout << "Deuxième note à l'index 1 : "<< notes[1] << endl;
// 🖥 Deuxième note à l'index 1 : 12
cout << "Dernière note à l'index 4 : "<< notes[4] << endl;
// 🖥 Dernière note à l'index 4 : 9.25
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Modification des éléments d'un tableau statique

▶︎ Syntaxe

nom_du_tableau [index_de_l_element] = valeur_a_assigner;

▶︎ Exemples

float notesEvals [5] {10.5,12,13,20,9.25};

cout << " 3eme note : " << notesEvals [2] << endl;
// 🖥 3eme note : 13

// Modification de la 3ème note
notesEvals [2] = 13.25;

cout << " 3eme note : " << notesEvals [2] << endl;
// 🖥 3eme note : 13.25
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Fonctionnement en mémoire

Initialisation d'un tableau de caractères legume :

char legume [] = {'p','a','t','a','t','e'};

Nom du tableau → adresse de la 1ere case :

// Opérateur & pour obtenir l'adresse
cout << &legume << endl; // 🖥 0x1000

‼️ Cases avant et après tableau ≠ 0

// On fait un dépassement (overflow)
cout << legume[6] << endl ; // 🖥 135

ℹ️ Une case mémoire (RAM) vaut un octet : 8 bits

Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Tableaux statiques en 2D

▶︎ Syntaxe d'un tableau en 2 dimensions

type_des_elements nom_tableau [nombre_lignes] [liste_colonnes];

▶︎ Exemples

int notesFilms [3][4];
center
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Tableaux statiques en 2D

▶︎ Déclaration et initialisation

// Déclaration d'un tableau de 3 lignes 4 colonnes
int notesFilms [3][4] 
{{10,11,12,13},
 {20,21,22,23},
 {30,31,32,33}};

// Déclaration équivalente en une ligne
int notesFilms [3][4] {{10,11,12,13},{20,21,22,23},{30,31,32,33}};
center
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Tableaux statiques en 2D

▶︎ Accès aux cases

int notesFilms [3][4] {{10,11,12,13},{20,21,22,23},{30,31,32,33}};

cout << "Contenu de la case [1][2] : " << notesFilms[1][2] << endl;
// 🖥 Contenu de la case [1][2] : 22
center
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

- Les tableaux dynamiques -

Vectors

Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

C'est quoi un vecteur ?

  • Un conteneur de la librairie C++ STL
  • Un vecteur n'a pas de taille définitive, on peut le faire grandir ou au contraire le réduire et ce durant l'exécution du programme
  • C'est très efficient
  • Vérification des limites (lève une erreur out of range)
  • Plein de fonctions disponibles : Tri, Inversion, Recherche ...
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Comment déclarer un vecteur ?

#include <vector>
using namespace std;

vector <char> voyelles; // Un vecteur de caractères vide
vector <int> notesEval; // Un vecteur d'entiers vide

// En spécifiant le nombre de cases au départ
vector <char> voyelles(6); // Un vecteur de 6 voyelles initialisés à NUL
vector <int> notesEval(10); // Un vecteur 10 entiers initialisés à 0

‼️ N'oubliez pas d'ajouter la bibliothèque <vector> au début de votre fichier !

Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Comment initialiser un vecteur ?

▶︎ Utilisation de listes d'initialisation


// Un vecteur de voyelles
vector <char> voyelles{'a','e','i','o','u','y'};

// Un vecteur 5 entiers
vector <int> notesEval{10,2,15,16,12}; 

// Création d'un vecteur de 10 doubles tous initialisés à 45.6
vector <double> temperatures(10,45.6);
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Comment accéder aux éléments d'un vecteur ?

▶︎ Utilisation de la méthode at()

vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers

cout << "Le premier élément est : " << notesEval.at(0) << endl;
// 🖥 Le premier élément est : 10

cout << "L'élément 2 est : " << notesEval.at(2) << endl;
// 🖥 L'élément 2 est : 15
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Connaître la taille d'un vecteur ?

▶︎ Utilisation de la méthode size()

vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers

cout << "Le vecteur comporte " << notesEval.size() << " éléments";
// 🖥 Le vecteur comporte 5 éléments
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Et le dernier élément ?

▶︎ Utilisation de l'indice avec size() ou de la méthode .back()

vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers

cout << "Le dernier élément est " << noteEvals.at(notesEval.size()-1) << endl;
// 🖥 Le dernier élément est 12

cout << "Le dernier élément est " << notesEval.back() << endl;
// 🖥 Le dernier élément est 12
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Ajouter un élément en fin de vecteur ?

▶︎ Utilisation de la méthode push_back()

vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers

notesEval.push_back(18);
cout << notesEval.at(5);
// 🖥 18
Programmation C++ • Lycée Louis Rascol, Albi
▶︎ C03 - Variables et Constantes

Et un vecteur en 2D ?

vector <vector<int>> matrice
{
    {10,11,12},
    {20,21,22},
    {30,31,32}
};

cout << "Valeur de l'élément (0,0) " << matrice.at(0).at(0) << endl;
// 🖥 10

cout << "Valeur de l'élément (1,2) " << matrice.at(1).at(2) << endl;
// 🖥 22

ℹ️ La syntaxe est un peu complexe, il faut juste comprendre qu'on déclare et qu'on utilise, un vecteur dans un vecteur.

Programmation C++ • Lycée Louis Rascol, Albi