10 réponses
mamiemando
Messages postés
33387
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
27 novembre 2024
7 803
6 mai 2008 à 10:09
6 mai 2008 à 10:09
Un exemple de code utilisant la STL (standard template library) c'est à dire les fonctionnalités du C++ standard.
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
La STL fournit des containers génériques (std::list, std::set, std::vector, std::map), ici on va utiliser les std::list. Le mot template signifie qu'un type sera passé en paramètre de la classe (ici je vais passer un unsigned c'est à dire un entier positif).
L'avantage de la STL c'est qu'il est très facile de parcourir une structure complexe avec des iterators (iterator, const_iterator pour parcourir à l'endroit, reverse_iterator et const_reverse_iterator pour parcourir à l'envers). Concrètement en tant qu'utilisateur c'est une simple boucle alors que ça peut être en arrière plan beaucoup plus complexe (par exemple pour les std::map on explore en fait un arbre de manière transparente).
Je t'invite aussi à te familiariser avec les const. Quand dans un prototype de fonction quelque chose est const, cela signifie que tu garanties qu'il ne va pas varier dans cette fonction. Bien entendu si tu ne respectes pas cette contrainte le compilateur te jettera. De manière générale il faut mettre des const quand c'est possible, c'est mieux.
Je t'invite aussi à te familiariser avec les référence (&) à ne pas confondre avec l'opérateur unaire & qui récupère l'adresse d'un objet (cf cours sur les pointeurs). Une référence peut être vue comme une adresse du point de vue mémoire, mais se manipule comme si on interagissait directement avec l'objet (donc pas de * ou de -> à trimbaler comme avec les pointeurs). Comme les const, il faut utiliser des référence dans tes prototypes quand c'est possible (je te rappelle que quand tu appelles une fonction les paramètres sont recopiés en mémoire, il est donc beaucoup plus rapide de recopier une adresse que l'objet complet).
Ce qui donne
Il est possible que les fonctions creer_liste et afficher_liste soient également templates (ie qu'elle manipule d'autres liste que des std::list<unsigned>, par exemple des std::list<double>), mais on ne va pas trop charger la barque ;-)
Bonne chance
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583
La STL fournit des containers génériques (std::list, std::set, std::vector, std::map), ici on va utiliser les std::list. Le mot template signifie qu'un type sera passé en paramètre de la classe (ici je vais passer un unsigned c'est à dire un entier positif).
L'avantage de la STL c'est qu'il est très facile de parcourir une structure complexe avec des iterators (iterator, const_iterator pour parcourir à l'endroit, reverse_iterator et const_reverse_iterator pour parcourir à l'envers). Concrètement en tant qu'utilisateur c'est une simple boucle alors que ça peut être en arrière plan beaucoup plus complexe (par exemple pour les std::map on explore en fait un arbre de manière transparente).
Je t'invite aussi à te familiariser avec les const. Quand dans un prototype de fonction quelque chose est const, cela signifie que tu garanties qu'il ne va pas varier dans cette fonction. Bien entendu si tu ne respectes pas cette contrainte le compilateur te jettera. De manière générale il faut mettre des const quand c'est possible, c'est mieux.
Je t'invite aussi à te familiariser avec les référence (&) à ne pas confondre avec l'opérateur unaire & qui récupère l'adresse d'un objet (cf cours sur les pointeurs). Une référence peut être vue comme une adresse du point de vue mémoire, mais se manipule comme si on interagissait directement avec l'objet (donc pas de * ou de -> à trimbaler comme avec les pointeurs). Comme les const, il faut utiliser des référence dans tes prototypes quand c'est possible (je te rappelle que quand tu appelles une fonction les paramètres sont recopiés en mémoire, il est donc beaucoup plus rapide de recopier une adresse que l'objet complet).
#include <list> #include <iostream> std::list<unsigned> creer_liste(const std::size_t & max){ std::list<unsigned> l; for(std::size_t i=0;i<=max;++i) l.push_back(i); return l; } void afficher_liste(const std::list<unsigned> & l){ std::list<unsigned>::const_iterator lit (l.begin()), lend(l.end()); for(;lit!=lend;++lit) std::cout << *lit << ' '; std::cout << std::endl; } int main(){ std::list<unsigned> ma_liste = creer_liste(20); afficher_liste(ma_liste); return 0; }
Ce qui donne
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Il est possible que les fonctions creer_liste et afficher_liste soient également templates (ie qu'elle manipule d'autres liste que des std::list<unsigned>, par exemple des std::list<double>), mais on ne va pas trop charger la barque ;-)
Bonne chance