Copy of https://perso.isima.fr/loic/cpp/tp08.fr.php
tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
Institut d'informatique ISIMA
  • twitter
  • linkedin
  • viadeo

[C++] TP 8

Read in English

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 ?

  1. un vector est un tableau dynamique de taille size() avec un operator[]
  2. un vector est un conteneur élémentaire qui propose un itérateur de début begin() et un itérateur de fin end()
  3. 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

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

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

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 de first() 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