UTILISATION DE LA STL

Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 - 9 juin 2005 à 23:52
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 26 juin 2005 à 10:18
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31936-utilisation-de-la-stl

Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
26 juin 2005 à 10:18
oki merci tout plein.
malgré les 3 heures du mat' j'ai compris ^^
++
ad
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
26 juin 2005 à 02:56
C'est parti ( malgré l'heure tardive )

4. La différence entre : Image::Image() { _Taille = 0; }
et Image::Image() : _Taille( 0 ) {} ?

Imaginons que _Taille soit une variable d'une classe Taille
qui a un constructeur à partir d'un entier (et sûrement un opérateur d'affectation)
Dans le premier cas, il y aura appel au constructeur par défaut de la classe Taille puis appele à l'opérateur d'affectation.
Dans le deuxième cas, seul le constructeur à partir d'un entier sera appelé. Le permier cas revient en fait à écrire
Image::Image() : _Taille() { _Taille = 0; }
Imagine si le constructeur par défaut est un peu lourd ou fait des choses inutiles pour finalement être recalculé à partir d'une taille à 0. ( std::string est un exemple )

8. la différence entre a++ et ++a sur un itérateur.
le premier te renvoie un nouvel itérateur temporaire puis incrémente ton itérateur. le deuxième incrémente ton itérateur et t'en renvoie une référence.
Dans le premier cas, tu as une création d'itérateur qui ne te sert pas.

J'espère que ces explications te vont.
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
25 juin 2005 à 22:22
-> hylvenir:

4. Tu devrais prendre le réflexe d'initialiser tes variables de classe comme suit :
Image::Image() : _Taille( 0 ) {}
et pas
Image::Image() { _Taille = 0; }
// Idem pour pour l'autre constructeur

C'est mieux pour certains objets (je ne m'étends pas).


tu pourrais t'étendre stp? je comprends pas pk tu dis ca, ce que ca change kwa.

8. Base.cpp ligne 40. Utilise ++ _Pair au lieu de _Pair ++, c'est une bonne habitude ça peut être que plus rapide.

pas d'accord, au pt de vue asm ca restera tjs "inc ma_variable"

merci pr tes commentaires...
++
ad
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
9 juin 2005 à 23:52
Salut,
alors quelques remarques dans le désordre de la lecture des sources.

1. On n'ouvre jamais un namespace dans un include
cf Image.h lign 16.

2. Un destructeur de classe non virtuel ne faisant rien... autant pas le mettre.

3. Le constructeur Image( char*, int ) devrait être en fait Image( const char*, int ) sinon un compilo moderne te fera au moins un warning sur quelque chose du genre Image img( "img.jpg", 1 );
"imp.jpg" étant un const char[] en C++.

4. Tes accesseurs devraient être const ( cf Image.getTaille )

4. Tu devrais prendre le réflexe d'initialiser tes variables de classe comme suit :
Image::Image() : _Taille( 0 ) {}
et pas
Image::Image() { _Taille = 0; }
// Idem pour pour l'autre constructeur

C'est mieux pour certains objets (je ne m'étends pas).

5. Image.cpp ligne 61. pourquoi utilises-tu compare
au lieu d'un simple == ?

6. Pour un tuto sur la STL, tu aurais pas utiliser for_each
pour ta fonction VersMinuscule.

7. Base.cpp lign 40. Tu devrais passer une référence constante de Database au lieu d'une copie probable.

8. Base.cpp ligne 40. Utilise ++ _Pair au lieu de _Pair ++, c'est une bonne habitude ça peut être que plus rapide.

9. Base.cpp ligne 89, 93. Tu pourrais ne faire qu'un appel à equal_range. genre
pair< Database::iterator, Database::iterator > found
= _Base.equal_range( ... )
if ( found.first == found.end() )
...

Voilà en gros sans trop rentrer dans les détails.
A+
Rejoignez-nous