Date de première publication : 2013/10/22
Note du 28/02/2023 : nous ne sommes pas allés assez loin en cours vendredi dernier, mais avec la documentation, les exercices jusqu'à 1.5 non inclus sont faisables. Le fil rouge également. Bon courage
Dans ce TP, nous allons nous intéresser à la manipulation basique de conteneurs de la bibliothèque standard et nous revenons sur l'écriture de code template avec quelques problèmes d'écriture.
Exemples du cours
Avant de commencer le TP, je vous recommande d'exécuter les différents exemples du cours.
Le tableau dynamique
Voici un code donné en cours : le récupérer, le compiler et l'exécuter
#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
int main (int, char **) {
std::vector<int> v;
int input;
while (std::cin >> input)
v.push_back (input);
std::sort(v.begin(), v.end());
std::copy (v.begin(), v.end(),
std::ostream_iterator<int> (std::cout, "\n"));
return 0;
}
L'écriture avec le ostream_iterator
est peu "dure". Est-ce que vous êtes capables d'afficher la saisie de manière différente ?
- un
vector
est un tableau dynamique de taillesize()
avec unoperator[]
- un
vector
est un conteneur élémentaire qui propose un itérateur de débutbegin()
et un itérateur de finend()
- Il existe une possibilité intermédiaire depuis le C++2011 : une version étendue du
for
for (int& e : v) {
// a faire
// on peut meme oublier le type "int" avec un mot-clé spécial ..
// mais c'est une autre histoire !
}
La pile
int main(int, char **) {
std::stack<int> is;
std::stack<double, std::vector<double> > ds;
for (int i = 0; i < 100; ++i)
is.push(i);
while (!is.empty()) {
std::cout << is.top() << std::endl;
ds.push((double)is.top()*is.top());
is.pop();
}
return 0;
}
File à priorité
Reprenez le code suivant en ajoutant les opérateurs qui manquent sur la classe ZZ
- l'
operator<()
pour comparer des éléments (ordre) - l'
operator<<()
pour afficher un élément sur le flux donné
class ZZ {
string nom, prenom;
double note;
// …
};
Pour utiliser la classe priority_queue
, il faut le bon espace de nommage mais surtout le bon fichier d'entête !
Votre bible : https://cppreference.com
using vzz = std::vector<ZZ>; // on peut aussi utiliser un typedef
vzz zz;
// il faut mettre des elements
// zz.push_back(ZZ(...));
priority_queue<ZZ> tri;
for(vzz::iterator it = zz.begin();
it!=zz.end(); ++it)
tri.push(*it);
while(!tri.empty()) {
cout << tri.top() << " ";
tri.pop();
}
Vecteur et pointeurs
- Instancier un vecteur de
ZZ *
et allouer dynamiquement quelques ZZs à ajouter à ce vecteur - Vérifier ce qu'il se passe avec valgrind
- Appeler la méthode
clear()
du conteneur. Vérifier ce qu'il se passe avec valgrind - Faire ce qu'il faut pour qu'il n'y ait pas de fuite mémoire. Contrôler avec valgrind.
Si vous voulez réutiliser le code précédent pour cet exercice, la file à priorité contient toujours des ZZs et non des pointeurs, ajouter un élément ne se fait plus par *it
!
Comparer des pointeurs, c'est toujours possible, c'est une comparaison d'index. On veut comparer des ZZs suivant l'opérateur que vous avez défini.
Tableau associatif
Fil rouge ...
Vous pouvez maintenant utiliser un conteneur de la bibliothèque standard pour la classe Groupe
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10