Liste c++

Fermé
Doudou - 6 mai 2008 à 09:42
 wazza - 11 mai 2009 à 13:54
Bonjour,
je dispose d'une constante soit X=20 par exemple, je veux creer une liste de valeurs qui prends toutes les valeurs de 0 jusqu'a X donc une liste (0....20)
je travaille en visual C++
merci pour votre aide
nb: je suis une vraie debutante
Doudou

10 réponses

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
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).
#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
5