Académique Documents
Professionnel Documents
Culture Documents
Achref El Mouelhi
elmouelhi.achref@gmail.com
Avril 2018 1 / 30
Plan
1 Introduction
2 Tableaux statiques
Tableau avec opérateur [ ]
Classe array (C++ 11)
3 Tableaux dynamiques
vector
map
Avril 2018 2 / 30
Introduction
C++
Les tableaux I c
ELH
une structure de données U
L MO
E
permettant de sauvegarder simultanément plusieurs valeurs
f
c hre
chaque élément a un indice statique ou personnalisé
c A
Avril 2018 3 / 30
Introduction
C++
I c
Deux types de tableaux en C++
ELH
U
statique : taille et type fixes
L MO
f E
hre
dynamique : taille extensible et/ou types différents
c
c A
Avril 2018 4 / 30
Tableaux statiques
C++
A
un tableau
h
cqu’on manipule avec les opérateurs [ ]
un
c
tableau objet de la classe array
Avril 2018 5 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Avril 2018 6 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Avril 2018 6 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Remarques
c h r e
c A
Avril 2018 7 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Remarques
c h r e
c A
Affectation de valeurs aux cases de tableau
tab[0] = 5;
tab[1] = 3;
Avril 2018 7 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
On peut faire une déclaration + une initialisation
int tab [2] = {5, 3};
Comme si la taille du tableau a été fixée à deux
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 8 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
On peut faire une déclaration + une initialisation
int tab [2] = {5, 3};
Comme si la taille du tableau a été fixée à deux
I c
On peut aussi omettre la taille
ELH
U
MO
int tab [] = {5, 3};
f E L
c hre
c A
Avril 2018 8 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
On peut faire une déclaration + une initialisation
int tab [2] = {5, 3};
Comme si la taille du tableau a été fixée à deux
I c
On peut aussi omettre la taille
ELH
U
MO
int tab [] = {5, 3};
f E L
Ou aussi
c hre
int c A
tab [] {5, 3};
Avril 2018 8 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
On peut faire une déclaration + une initialisation
int tab [2] = {5, 3};
Comme si la taille du tableau a été fixée à deux
I c
On peut aussi omettre la taille
ELH
U
MO
int tab [] = {5, 3};
f E L
Ou aussi
c hre
int c A
tab [] {5, 3};
C++
c
Dépasser la taille déclarée d’un tableau est syntaxiquement
I
correcte.
EL H
U
O à l’exécution
Merreur
Cependant, ceci peut générer une
L
h r e fE
A c
c
Avril 2018 9 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
c
Dépasser la taille déclarée d’un tableau est syntaxiquement
I
correcte.
EL H
U
O à l’exécution
Merreur
Cependant, ceci peut générer une
L
h r e fE
A c
c
ne génère pas d’erreur
Le code suivant
tab[2] = 10;
Avril 2018 9 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Avril 2018 10 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Avril 2018 10 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Le tableau est un pointeur sur la première case
cout << *tab << endl;
// équivalent à
cout << tab[0] << endl;
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 11 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Le tableau est un pointeur sur la première case
cout << *tab << endl;
// équivalent à
cout << tab[0] << endl;
I c
On peut utiliser le pointeur pour accéder à un élE
H
L du tableau
O U ément
d’indice i
L M
cout << *(tab + i) << endl;
h r e fE
// équivalent à
A c<< endl;
c
cout << tab[i]
Avril 2018 11 / 30
Tableaux statiques Tableau avec opérateur [ ]
C++
Le tableau est un pointeur sur la première case
cout << *tab << endl;
// équivalent à
cout << tab[0] << endl;
I c
On peut utiliser le pointeur pour accéder à un élE
H
L du tableau
O U ément
d’indice i
L M
cout << *(tab + i) << endl;
h r e fE
// équivalent à
A c<< endl;
c
cout << tab[i]
Attention
cout << *tab + i << endl;
// équivalent à
cout << tab[0] + i << endl;
Avril 2018 11 / 30
Tableaux statiques Classe array (C++ 11)
C++
Avril 2018 12 / 30
Tableaux statiques Classe array (C++ 11)
C++
Avant utilisation, il faut inclure
#include <array>
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 13 / 30
Tableaux statiques Classe array (C++ 11)
C++
Avant utilisation, il faut inclure
#include <array>
Avril 2018 13 / 30
Tableaux statiques Classe array (C++ 11)
C++
Avant utilisation, il faut inclure
#include <array>
c
c A
cout << tab.size() << endl;
// affiche 4
Avril 2018 13 / 30
Tableaux statiques Classe array (C++ 11)
C++
Avant utilisation, il faut inclure
#include <array>
c
c A
cout << tab.size() << endl;
// affiche 4
Pour parcourir et afficher les éléments d’un tableau
for (int i = 0; i < tab.size(); i++)
cout << tab[i] << " ";
// affiche 4 7 1 5
Avril 2018 13 / 30
Tableaux statiques Classe array (C++ 11)
C++
I c
H
On peut aussi utiliser la méthode at() pour récupérer un élément
EL
for (int i = 0; i < tab.size(); U
cout << tab.at(i) << " M
O i++)
// affiche 4 7 1 5 f E
L ";
c h re
c A
Avril 2018 14 / 30
Tableaux dynamiques
C++
c
Pouvant être utilisés comme les tableaux statiques
I
La taille est extensible ELH
U
L MO
f E
c hre
c A
Avril 2018 15 / 30
Tableaux dynamiques
C++
c
Pouvant être utilisés comme les tableaux statiques
I
La taille est extensible ELH
U
L MO
re f E
h
Deux catégories de conteneur
c
c :Ales éléments sont rangés les uns à coté des autres
Séquentiel
Associatif : un ensemble de clé / valeur
Avril 2018 15 / 30
Tableaux dynamiques
C++
queue (file)
stack (pile)
Avril 2018 16 / 30
Tableaux dynamiques
C++
I c
set : une map dont la clé = la valeur
H
ElaLclé
multiset : un set avec possibilité de doublonsU
MO
pour
fE
multimap : une map avec possibilitL é de doublons pour la clé
unordered set hr
c e
c A
multiset
unordered
unordered map
unordered multimap
Avril 2018 17 / 30
Tableaux dynamiques vector
C++
Avril 2018 18 / 30
Tableaux dynamiques vector
C++
Avril 2018 18 / 30
Tableaux dynamiques vector
C++
Avril 2018 18 / 30
Tableaux dynamiques vector
C++
Pour insérer des éléments dans le vecteur
vecteur.push_back(2);
vecteur.push_back(5);
vecteur.push_back(8);
I c
vecteur.push_back(4);
ELH
U
L MO
f E
c hre
c A
Avril 2018 19 / 30
Tableaux dynamiques vector
C++
Pour insérer des éléments dans le vecteur
vecteur.push_back(2);
vecteur.push_back(5);
vecteur.push_back(8);
I c
vecteur.push_back(4);
ELH
U
L MO
f E
Ou tout simplement
c hre
c A
vector <int> vecteur = {2, 5, 8, 4};
Avril 2018 19 / 30
Tableaux dynamiques vector
C++
Pour insérer des éléments dans le vecteur
vecteur.push_back(2);
vecteur.push_back(5);
vecteur.push_back(8);
I c
vecteur.push_back(4);
ELH
U
L MO
f E
Ou tout simplement
c hre
c A
vector <int> vecteur = {2, 5, 8, 4};
Avril 2018 19 / 30
Tableaux dynamiques vector
C++
Pour accéder à un élément du vecteur d’indice i
cout << vecteur[i] << endl;
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 20 / 30
Tableaux dynamiques vector
C++
Pour accéder à un élément du vecteur d’indice i
cout << vecteur[i] << endl;
I c
Ou aussi
ELH
cout << vecteur.at(i) << endl;
U
L MO
f E
c hre
c A
Avril 2018 20 / 30
Tableaux dynamiques vector
C++
Pour accéder à un élément du vecteur d’indice i
cout << vecteur[i] << endl;
I c
Ou aussi
ELH
cout << vecteur.at(i) << endl;
U
L MO
f E
rauepremier élément
Un raccourci pour accc h
c A
éder
cout << vecteur.front() << endl;
Avril 2018 20 / 30
Tableaux dynamiques vector
C++
Pour accéder à un élément du vecteur d’indice i
cout << vecteur[i] << endl;
I c
Ou aussi
ELH
cout << vecteur.at(i) << endl;
U
L MO
f E
rauepremier élément
Un raccourci pour accc h
c A
éder
cout << vecteur.front() << endl;
Avril 2018 20 / 30
Tableaux dynamiques vector
C++
Pour parcourir et afficher tous les éléments d’un vecteur
for(int i = 0; i < vecteur.size(); i++)
{
cout << vecteur[i] << " ";
}
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 21 / 30
Tableaux dynamiques vector
C++
Pour parcourir et afficher tous les éléments d’un vecteur
for(int i = 0; i < vecteur.size(); i++)
{
cout << vecteur[i] << " ";
}
I c
ELH
Ou avec le for simplifié
U
for (int elt: vecteur)
L MO
{
f E
cout << elt << endl;
chre
c A
}
Avril 2018 21 / 30
Tableaux dynamiques vector
C++
Pour parcourir et afficher tous les éléments d’un vecteur
for(int i = 0; i < vecteur.size(); i++)
{
cout << vecteur[i] << " ";
}
I c
ELH
Ou avec le for simplifié
U
for (int elt: vecteur)
L MO
{
f E
cout << elt << endl;
chre
c A
}
Ou avec les itérateurs
for(auto it = vecteur.begin(); it != vecteur.end(); it++)
{
cout << *it << ’ ’ ;
}
Avril 2018 21 / 30
Tableaux dynamiques vector
C++
vecteur.pop_back();
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 22 / 30
Tableaux dynamiques vector
C++
vecteur.pop_back();
I c
ELH
U
Pour supprimer l’élément du vecteur d’indice i
L MO
f E
vecteur.erase(vecteur.begin() + i)
c hre
c A
Avril 2018 22 / 30
Tableaux dynamiques vector
C++
vecteur.pop_back();
I c
ELH
U
Pour supprimer l’élément du vecteur d’indice i
L MO
f E
vecteur.erase(vecteur.begin() + i)
c hre
c A
Pour supprimer les trois premiers éléments
vecteur.erase(vecteur.begin(), vecteur.begin() + 3)
Avril 2018 22 / 30
Tableaux dynamiques vector
C++
Les vecteurs peuvent être utilisés comme les tableaux statiques
// déclarer un vecteur de taille 4
vector <int> vecteur (4);
I c
// affecter 4 valeurs au vecteur
ELH
vecteur[0] = 2;
U
vecteur[1] = 5;
L MO
vecteur[2] = 8;
f E
c
vecteur[3] = 4;
A hre
c
for (int
elt: vecteur)
{
cout << elt << " ";
}
// affiche 2 5 8 4
Avril 2018 23 / 30
Tableaux dynamiques vector
C++
Avril 2018 24 / 30
Tableaux dynamiques vector
C++
I
c
Deux solutions pour étendre la taille d’un tableau
EL H
D’une manière explicite en changeant U
M O la taille du tableau
f
D’une manière implicite en L
Eajoutant les éléments avec
push back() h
c r e
c A
Avril 2018 25 / 30
Tableaux dynamiques vector
C++
Première solution
vecteur.resize(6);
I c
vecteur[4] = 1;
ELH
vecteur[5] = 7;
U
L MO
for (int elt: vecteur)
f E
{
c hre
}
c A
cout << elt << " ";
// affiche 2 5 8 4 1 7 8
Avril 2018 26 / 30
Tableaux dynamiques vector
C++
Deuxième solution
vecteur.push_back(1);
I c
vecteur.push_back(7);
ELH
U
for (int elt: vecteur)
L MO
f E
hre
{
c
c A
cout << elt << " ";
}
// affiche 2 5 8 4 1 7 8
Avril 2018 27 / 30
Tableaux dynamiques map
C++
Pour utiliser les vecteurs, il faut inclure
#include <map>
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 28 / 30
Tableaux dynamiques map
C++
Pour utiliser les vecteurs, il faut inclure
#include <map>
Avril 2018 28 / 30
Tableaux dynamiques map
C++
Pour utiliser les vecteurs, il faut inclure
#include <map>
c A
dictionnaire.emplace(2, "RM");
Avril 2018 28 / 30
Tableaux dynamiques map
C++
Pour utiliser les vecteurs, il faut inclure
#include <map>
c A
dictionnaire.emplace(2, "RM");
Ou déclaration + initialisation
map<int, std::string> dictionnaire {
{ 1, "FCB" },
{ 2, "RM" }
};
Avril 2018 28 / 30
Tableaux dynamiques map
C++
Ou déclaration + initialisation
map<int, std::string> dictionnaire {
{ 1, "FCB" },
{ 2, "RM" }
};
dictionnaire.emplace(2, "MU");
I c
ELH
// impossible d’ajouter cet élément car la clé existe
U
L MO
f E
c hre
c A
Avril 2018 29 / 30
Tableaux dynamiques map
C++
Ou déclaration + initialisation
map<int, std::string> dictionnaire {
{ 1, "FCB" },
{ 2, "RM" }
};
dictionnaire.emplace(2, "MU");
I c
ELH
// impossible d’ajouter cet élément car la clé existe
U
L MO
re f E
On peut aussi ajouter des éléments ainsi
c h
dictionnaire[4] = "MU";
c A
Avril 2018 29 / 30
Tableaux dynamiques map
C++
Ou déclaration + initialisation
map<int, std::string> dictionnaire {
{ 1, "FCB" },
{ 2, "RM" }
};
dictionnaire.emplace(2, "MU");
I c
ELH
// impossible d’ajouter cet élément car la clé existe
U
L MO
re f E
On peut aussi ajouter des éléments ainsi
dictionnaire[4] = "MU";
c h
c A
Pour parcourir et afficher les éléments d’une map
for (auto elt: dictionnaire)
{
cout << "cle " << elt.first << " " ;
cout << "valeur " << elt.second << endl;
}
Avril 2018 29 / 30
Tableaux dynamiques map
C++
I c
ELH
U
L MO
f E
c hre
c A
Avril 2018 30 / 30
Tableaux dynamiques map
C++
I c
ELH
O
Pour chercher un élément selon une clé U
L M
h r e f E sur map
auto it = dictionnaire.find(1);
c
// retourne un itérateur
A
c
if (it != dictionnaire.end())
cout << "trouvée";
// affiche trouvée
Avril 2018 30 / 30