Professional Documents
Culture Documents
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;
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<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> 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> 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
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]
Pas--pas
0
i
...
...
M.size
()-1
Pas--pas
M[i]
.siz
e()1
...
...
M.size
()-1
Pas--pas
...
M[i].si
ze()-1
...
M.size
()-1
Pas--pas
...
M[i].si
ze()-1
...
M.size(
)-1
Pas--pas
...
M[i].si
ze()-1
...
M.size(
)-1
Pas--pas
0
i
M[i].size()
j
...
M[i].si
ze()-1
...
M.size(
)-1
Pas--pas
0
i
M[i].size()
j
...
M[i].si
ze()-1
...
M.size(
)-1
Pas--pas
0
i
...
M[i].si
ze()-1
...
M.size(
)-1
Pas--pas
1
i
...
M[i].si
ze()-1
...
M.size(
)-1
Pas--pas
...
M[i].si
ze()-1
...
M.size(
)-1
Pas--pas
...
M[i].si
ze()-1
...
M.size(
)-1
2 12
L'instruction
cout << endl;
n'est pas contenue dans la boucle.
Elle est excute aprs.
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
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
45
81
90
31
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 :
- - - - - - . + . . . . |
. . + . . . |
. . . + . . |
. . . . + . |
. . . . . + |
. . . . . . |