Date de première publication : 2013/10/22
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();
}
Bibliothèque standard et pointeurs
- Instancier un
std::vector
deZZ *
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 gérer le classement du vector avec une file à priorité, il va falloir faire quelques modifications car l'ordre naturel sur les pointeurs existent (ce sont des entiers ! :-))
- soit vous faites, une file sur des ZZ en adaptant l'insertion
- soit vous faite une file de pointeurs - il faut alors fournir un comparateur sur les pointeurs
Le compilateur ne nous laisse pas écrire un opérateur de comparaison sur des pointeurs, il est nécessaire de passer par un comparateur
Tableau associatif
Je vous redonne les morceaux de code concernant le tableau associatif : définition, recherche et affichage.
using mss = std::map<string, string> ;
mss m;
m.insert(pair<string,string>("loic", "405042"));
m.insert(make_pair("isima", "405000"));
m["secours"] = "42";
mss::iterator it = m.find("loic");
if (it==m.end()) cout << "et moi ?";
const string& first(const pair<string,string>& p) { return p.first; }
int main(int, char**) {
map<string, string> liste;
map<string, string>::const_iterator it
= liste.begin();
while(it!=liste.end()) {
cout << it->first << " "
<< it->second << endl;
++it;
}
transform(liste.begin(), liste.end(),
ostream_iterator<string>(cout, " "), first);
return 0;
}
Pouvez-vous écrire un petit programme :
- qui essaie l'algorithme
copy()
sur la map ? - qui utilise une fonction
paire()
sur le modèle defirst()
pour afficher le contenu de la map ? - qui lit les entrées de l'annuaire à partir d'un fichier texte (flux) dont le nom sera codé en dur dans le programme
- qui affiche la liste des entrées sur la sortie standard s'il n'y a aucun paramètre donné en ligne de commande
- qui affiche l'entrée trouvée ou un message "non trouvé" si l'utilisateur donne un argument en ligne de commande
- Est-ce que vous pouvez créer l'annuaire inversé ?
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