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
ISIMA
  • twitter
  • linkedin
  • viadeo

[C++] TP 8

Read in English

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 ?

  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();
}

Bibliothèque standard et pointeurs

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 ! :-))

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 :

Fil rouge ...

Vous pouvez maintenant utiliser un conteneur de la bibliothèque standard pour la classe Groupe