Vous êtes sur la page 1sur 60

C++ : tableaux

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

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++

Les tableaux statiques


I c

Tous les éléments doivent avoir le même type
E L H
U
MO dépasser
Il faut préciser une taille qu’on ne peut
L
r e E :
Deux types de tableau fstatique

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++

Déclaration d’un tableau : syntaxe


I c

type nomTableau [taille];
ELH
U
L MO
f E
c hre
c A

Avril 2018 6 / 30
Tableaux statiques Tableau avec opérateur [ ]

C++

Déclaration d’un tableau : syntaxe


I c

type nomTableau [taille];
ELH
U
L MO
f E
hre
Déclaration d’un tableau d’entier de taille 2 : exemple
c
int tab [2];c A

Avril 2018 6 / 30
Tableaux statiques Tableau avec opérateur [ ]

C++

Remarques

Chaque élément du tableau est accessible via son indice dans le


tableau
I c

ELH
Le premier élément est d’indice 0
U
L
Le dernier élément est d’indice MO - 1
fE
taille

c h r e
c A

Avril 2018 7 / 30
Tableaux statiques Tableau avec opérateur [ ]

C++

Remarques

Chaque élément du tableau est accessible via son indice dans le


tableau
I c

ELH
Le premier élément est d’indice 0
U
L
Le dernier élément est d’indice MO - 1
fE
taille

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};

Il est aussi de préciser une taille qu’on n’utilise pas à l’initialisation


int tab [4] {5, 3};
tab[2] = 8;
tab[3] = 1;
Avril 2018 8 / 30
Tableaux statiques Tableau avec opérateur [ ]

C++

Contrairement à certains langages de programmation (Java, 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++

Contrairement à certains langages de programmation (Java, 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++

Pour parcourir et afficher le contenu d’un tableau


for (int i = 0; i < 4; i++)
{
I c

cout << tab[i] << endl;
ELH
}
U
L MO
f E
c hre
c A

Avril 2018 10 / 30
Tableaux statiques Tableau avec opérateur [ ]

C++

Pour parcourir et afficher le contenu d’un tableau


for (int i = 0; i < 4; i++)
{
I c

cout << tab[i] << endl;
ELH
}
U
L MO
f E
re ée (foreach)
c h
Où encore la version simplifi
for (int celtA: tab)
{
cout << elt << endl;
}

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++

Classe array (C++ 11)


I c

EL H
définie dans STL : Standard Template U Library
pouvant fonctionner avecE
MO
lesLopérateurs [ ]

c h efla taille avec la méthode size()


rérer
c A
possibilité de récup

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>

Déclaration d’un tableau de taille 4


I c

array<int, 4> tab = {4, 7, 1, 5};
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>

Déclaration d’un tableau de taille 4


I c

array<int, 4> tab = {4, 7, 1, 5};
ELH
U
L MO
f E
hre
Pour connaı̂tre la taille

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>

Déclaration d’un tableau de taille 4


I c

array<int, 4> tab = {4, 7, 1, 5};
ELH
U
L MO
f E
hre
Pour connaı̂tre la taille

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++

Les tableaux dynamiques (les conteneurs)

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++

Les tableaux dynamiques (les conteneurs)

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++

Les tableaux séquentiels


vector
très proche des tableaux statiques
I c
très couteux en insertion et suppression
EL H
U
MO
adapté pour la recherche d’un élément
list E L
f double
c h r e
utilisant le principe de chaı̂nage

plus
A
cefficace pour les opérations d’insertion et suppression
la recherche se fait dans un ordre séquentiel

queue (file)
stack (pile)

Avril 2018 16 / 30
Tableaux dynamiques

C++

Les tableaux associatifs

map : la clé est unique et les éléments sont triés

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++

Pour utiliser les vecteurs, il faut inclure


#include <vector>
I c

ELH
U
L MO
f E
c hre
c A

Avril 2018 18 / 30
Tableaux dynamiques vector

C++

Pour utiliser les vecteurs, il faut inclure


#include <vector>
I c

ELH
Déclaration d’un vecteur : syntaxe OU
L M
ref
vector <type> nomTableau; E
c h
c A

Avril 2018 18 / 30
Tableaux dynamiques vector

C++

Pour utiliser les vecteurs, il faut inclure


#include <vector>
I c

ELH
Déclaration d’un vecteur : syntaxe OU
L M
ref
vector <type> nomTableau; E
c h
Exemple
c A
vector <int> vecteur;

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};

Pour connaı̂tre le nombre d’élément d’un vecteur


cout << vecteur.size() << endl;

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;

Un raccourci pour accéder au dernier élément


cout << vecteur.back() << 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++

Pour supprimer le dernier élément

vecteur.pop_back();

I c

ELH
U
L MO
f E
c hre
c A

Avril 2018 22 / 30
Tableaux dynamiques vector

C++

Pour supprimer le dernier élément

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++

Pour supprimer le dernier élément

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++

Si on dépasse la taille du vecteur, ça génère pas d’erreur mais les


éléments ne seront pas pris en compte
vecteur[4] = 1;
I c

vecteur[5] = 7;
ELH
U
L MO
for (int elt: vecteur)
f E
{
c hre
c A
cout << elt << " ";
}
// affiche 2 5 8 4
//Les deux derniers éléments ne seront pas affichés

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>

Déclaration d’une map : syntaxe


I c

map<int, std::string> dictionnaire;
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>

Déclaration d’une map : syntaxe


I c

map<int, std::string> dictionnaire;
ELH
U
L MO
Pour ajouter des éléments
f E
re"FCB");
c h
dictionnaire.emplace(1,

c A
dictionnaire.emplace(2, "RM");

Avril 2018 28 / 30
Tableaux dynamiques map

C++
Pour utiliser les vecteurs, il faut inclure
#include <map>

Déclaration d’une map : syntaxe


I c

map<int, std::string> dictionnaire;
ELH
U
L MO
Pour ajouter des éléments
f E
re"FCB");
c h
dictionnaire.emplace(1,

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++

Pour supprimer l’élément ayant la clé 3


dictionnaire.erase(3);

I c

ELH
U
L MO
f E
c hre
c A

Avril 2018 30 / 30
Tableaux dynamiques map

C++

Pour supprimer l’élément ayant la clé 3


dictionnaire.erase(3);

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

Vous aimerez peut-être aussi