You are on page 1of 68

Tableaux dynamiques avec vector

Tableaux statiques
Les tableaux que nous avons vus jusqu'ici sont des tableaux statiques:
int tab[3];
Cette forme de tableaux vient du langage C, et est encore trs utilise.
Cependant, elle n'est pas trs pratique. En particulier:
un tableau de cette forme ne connat pas sa taille.
on ne peut pas faire d'affectation globale, par exemple on ne peut
pas faire:
int T1[3] = {1, 9, 2};
int T2[3];
T2 = T1;
une fonction ne peut pas retourner de tableaux.

La classe vector
Le C++ a introduit la classe vector, qui n'a pas ces inconvnients.
Un tableau de 3 lments de type int peut se dclarer ainsi:
vector<int> tab(3);
on peut accder aux lments de tab de la mme faon qu'on
accderait aux lments d'un tableau statique du C:
tab[0] = 4;

Il faut ajouter la ligne


#include <vector>
au dbut du programme pour pouvoir utiliser la classe vector.

La classe vector
type des lments
vector<int> tab(3);
nombre d'lments
attention ne pas l'oublier. Si on fait:
vector<int> tab;
le tableau n'a pas d'lments, et essayer d'accder
un lment, comme par exemple:
tab[0] = 0;
gnrera sans doute un Segmentation fault

La classe vector
vector<int> tab(3);
On peut aussi faire:
vector<int> tab(3, 1);
pour initialiser tous les lments du tableau 1 au moment de la
dclaration.
et:
vector<int> tab2(tab);
pour initialiser les lments de tab2 aux mmes valeurs que tab.
Il suffit de changer int pour changer le type des lments:
vector<double> tab3(5);
vector<bool> tab4(128);

La classe vector
vector<int> tab(3);
On peut maintenant connatre le nombre d'lments de tab en
utilisant la fonction size():
int taille = tab.size();
On peut faire des affectations globales, par exemple:
tab[0] = 1;
tab[1] = 9;
tab[2] = 2;
vector<int> tab2(3);
tab2 = tab;

vector en paramtre d'une fonction


void initialise(vector<int> & T)
{
for(int i(0); i < T.size(); ++i) {
T[i] = rand() % 100;
}
}
...
vector<int> tab(3);
initialise(tab);

pas besoin de passer la


taille du tableau en
paramtre, il suffit d'utiliser
la fonction size()

vector en rsultat d'une fonction


vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {
T[i] = i * i;
}
return T;
}

possible uniquement parce que T est dclar


en vector.
Pas possible si T avait t dclar avec:
int T[10];

...
vector<int> tab = premiers_carres(10);

vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {
T[i] = i * i;
}
return T;
}
...
vector<int> tab = premiers_carres(10);

10

vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {
T[i] = i * i;
}
return T;
}
...
vector<int> tab = premiers_carres(10);

10

vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {
T[i] = i * i;
}
return T;
}
...
vector<int> tab = premiers_carres(10);

?
?
?
?
?
?
?
?
?
?

10

vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {
T[i] = i * i;
}
return T;
}
...
vector<int> tab = premiers_carres(10);

0
1
4
9
16
25
36
49
64
81

vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {
T[i] = i * i;
}
return T;
}

0
1

...

4
9
16
25

vector<int> tab = premiers_carres(10);


36
49
64
81

vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {

tab
?

T[i] = i * i;
}

return T;

0
1

...

4
9
16
25

vector<int> tab = premiers_carres(10);


36
49
64
81

?
?
?
?
?
?
?

vector<int> premiers_carres(int n)
{
vector<int> T(n);
for(int i(0); i < n; ++i) {
T[i] = i * i;

tab
0

return T;

9
16

...
vector<int> tab = premiers_carres(10);

25
36
49
64
81

Elements de type string


On peut dclarer un tableau dont les lments sont de type string:
vector<string> noms(5);
On peut initialiser un lment en faisant par exemple:
noms[1] = "Dupont";
et l'afficher en faisant:
cout << noms[1] << endl;

Accder un caractre d'un des


lments
vector<string> noms(5);
noms[1] = "Dupont";
Rappel: Si mot est dclar avec:
string mot = "Dupont";
char c = mot[2];
met le caractre p dans la variable c.
Pour accder au troisime caractre de noms[1], on fera donc:
char c = noms[1][2];
de type string

Elements de type vector


On peut aussi dclarer un tableau dont les lments sont eux-mme
de type vector:
vector< vector<double> > M(5);

Elements de type vector


On peut aussi dclarer un tableau dont les lments sont eux-mme
de type vector:
vector< vector<double> > M(5);

attention laisser un espace (au moins) entre le premier >


et le deuxime > !
Si on fait
vector< vector<double>> M(5);
le compilateur pense que les deux > successifs
reprsentent l'oprateur >> utilis gnralement avec cin

Elements de type vector


On peut aussi dclarer un tableau dont les lments sont eux-mme
de type vector:
vector< vector<double> > M(5);
M est un tableau de 5 lments.
Chaque lment est un tableau.
Plus exactement, chaque lment est un tableau vide.

Initialiser un element de type vector


vector< vector<double> > M(5);
On peut faire:
M(0) = vector<double>(3);
pour initialiser le premier lment un tableau
de 3 lments.

Initialiser un element de type vector


vector< vector<double> > M(5);
M[0] = vector<double>(3);
M[0] est maintenant un tableau de 3 lments.
M[0][1] est l'lment d'indice 1 du tableau M[0]

Tableau de tableaux
Si on fait:
vector< vector<double> > M(5);
M[0] = vector<double>(3);
M[1] = vector<double>(2);
M[2] = vector<double>(5);
M[3] = vector<double>(3);
M[4] = vector<double>(2);
on obtient le tableau de tableaux:

Tableau de tableaux
cas particulier:
vector< vector<double> > M(5);
for(int i(0); i < 5; ++i) {
M[i] = vector<double>(3);
}

Tableau de tableaux
Cas particulier:
vector< vector<double> > M(5);
for(int i(0); i < 5; ++i) {
M[i] = vector<double>(3);

}
M[i][j] est l'lment d'indice j du tableau
d'indice i
on peut reprsenter M plus simplement:

M[2][1]

Initialiser les lments 0


Pour initialiser tous les lments des tableaux de M, il faut utiliser deux boucles for
imbriques:
for(int i(0); i < M.size(); ++i) {
for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

Pas--pas

0
i

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}
M[i].s
ize()1

...

...
M.size
()-1

Pas--pas

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

M[i]
.siz
e()1

...

...
M.size
()-1

Pas--pas

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

...

M[i].si
ze()-1

...
M.size
()-1

Pas--pas

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

...

M[i].si
ze()-1

...
M.size(
)-1

Pas--pas

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

...

M[i].si
ze()-1

...
M.size(
)-1

Pas--pas

0
i

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

M[i].size()
j

...

M[i].si
ze()-1

...
M.size(
)-1

Pas--pas

0
i

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

M[i].size()
j

...

M[i].si
ze()-1

...
M.size(
)-1

Pas--pas

0
i

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

...

M[i].si
ze()-1

...
M.size(
)-1

Pas--pas

1
i

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

...

M[i].si
ze()-1

...
M.size(
)-1

Pas--pas

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

...

M[i].si
ze()-1

...
M.size(
)-1

Pas--pas

for(int i(0); i < M.size(); ++i) {


for(int j(0); j < M[i].size(); ++j) {
M[i][j] = 0;
}
}

...

M[i].si
ze()-1

...
M.size(
)-1

Affichage: Raisonner sur un exemple


Considrons le cas particulier o M.size() vaut 3 et M[i].size() vaut 2:
Si l'on fait:
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << endl;
}
}
le tableau sera affich sur une seule longue colonne:
8
3
9
7
12
5

2 12

Raisonner sur un exemple


Si on veut afficher le tableau M avec 3 lignes et 2 colonnes:
8 3
9 7
12 5
on pourrait l'afficher sans utiliser de boucles en crivant:
cout << M[0][0] << " " << M[0][1] << endl;
cout << M[1][0] << " " << M[1][1] << endl;
cout << M[2][0] << " " << M[2][1] << endl;

Afficher une ligne avec une boucle


L'affichage d'une ligne
cout << M[0][0] << " " << M[0][1] << endl;
peut se dcomposer en:
cout << M[0][0] << " ";
cout << M[0][1] << " ";
cout << endl;
qui peut s'crire avec une boucle for:
for(int j(0); j < 2; ++j) {
cout << M[0][j] << " ";
}
cout << endl;

L'instruction
cout << endl;
n'est pas contenue dans la boucle.
Elle est excute aprs.

Afficher plusieurs lignes


Pour afficher toutes les lignes, il suffit d'inclure le code qui affiche une ligne:
for(int j(0); j < 2; ++j) {
cout << M[0][j] << " ";
}
cout << endl;
dans une seconde boucle for.
Le 0 correspondait au numro de la ligne afficher, il faut donc le remplacer
par la variable compteur de cette seconde boucle for, ici i:
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

Gnraliser
Le cas particulier est valable pour M.size() = 3 et M[i].size() = 2:
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}
Le cas gnral est facile crire maintenant:
for(int i(0); i < M.size(); ++i) {
for(int j(0); j < M[i].size(); ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

8 3

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

8 3

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

2 12

0
8 3

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

2 12

1
8 3

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

8 3

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

8 3
9

2 12

Pas--pas
for(int i(0); i < 3; ++i) {
for(int j(0); j < 2; ++j) {
cout << M[i][j] << " ";
}
cout << endl;
}

8 3
9 7
12 5

2 12

Tableau de tableaux en rsultat d'une fonction


vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

vector< vector<int> > initialise2D(int n, int m)


{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

34 45 81

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

34 45 81

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

34 45 81

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

34 45 81
12 90 31

2
3
vector< vector<int> > initialise2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

resultat

34 45 81
12 90 31

vector< vector<int> > initialise2D(int n, int m)


{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
34

45

81

vector< vector<int> > T = initialise(2, 3);


12

90

31

vector< vector<int> > initialise2D(int n, int m)


{
vector< vector<int> > resultat(n);
for(int i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(int j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
...
vector< vector<int> > T = initialise(2, 3);

34 45 81
12 90 31

Exercice
crire la fonction d'en-tte:
vector< vector<char> > triangle(int n)
qui retourne un tableau de n tableaux de n lments chacun, initialis :

- - - - - - . + . . . . |
. . + . . . |
. . . + . . |
. . . . + . |
. . . . . + |
. . . . . . |

You might also like