Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

STL ou Classe??

10 réponses
Avatar
zoubidaman
Bonjour,

je me posais la question suivante :

Vaut-il mieux, quand on a le choix de faire les deux, utiliser les
composants de la STL ou bien se créer une classe?

Ex: pour stocker une liste de 2 nombres, on peut faire un vecteur de
paires

vector<pair<int,int> > test;

Mais on peut aussi créer une classe et faire un vecteur de cette
classe:

class toto
{
int i,j;
}
toto foo;

vector<foo> test;

Enfin, voilà c'est un exemple, mais ce à quoi je pense serait plutôt
des listes et des maps...

Donc ce que je voudrais savoir, c'est si plus rapide d'utiliser la STL
ou les classes... voilà tout

Merci d'avance!!

10 réponses

Avatar
Christophe Lephay
"Zoubidaman" a écrit dans le message de
news:
je me posais la question suivante :

Vaut-il mieux, quand on a le choix de faire les deux, utiliser les
composants de la STL ou bien se créer une classe?


La SL a été conçue bien entendu pour être utilisée. Voici quelques raisons
en vrac pour utiliser ses fonctionnalités :

* Développées par des spécialistes, on est en droit d'en attendre de bonnes
performances
* Elles sont déjà déboguées
* Elles sont standardes, donc probablement déjà connues de quiconque aurait
à lire ton code
* Elles sont unifiées, conçus pour fonctionner pleinement entre elles (par
exemple tu peux utiliser les std::algorithmes sur les std::conteneurs)

Il me semble que c'est une drôle de question que tu te poses, là :)

Chris

Avatar
Fabien LE LEZ
On 22 Jul 2003 19:05:21 -0700, (Zoubidaman)
wrote:

Vaut-il mieux, quand on a le choix de faire les deux, utiliser les
composants de la STL ou bien se créer une classe?


Prenons par exemple un train de voyageurs. J'ai une classe Voyageur,
et je décide de représenter, en première approximation, un wagon sous
la forme d'un std::set<Voyageur>, et le train sous la forme d'un
std::vector<Wagon>.
La question qui se pose est : un "Wagon" est-il un std::set<Voyageur>,
ou une classe contenant un std::set<Voyageur> ?
La réponse est... ça dépend du contexte ;-)

On peut commencer par des typedef :

typedef std::set<Voyageur> Wagon;
typedef std::vector<Wagon> Train;

Ce qui devrait permettre de modifier a posteriori le type de Wagon
pour en faire une classe (par exemple pour rajouter d'autres
informations, ou pour rajouter une fonction de calcul du prix total
des places), sans casser le code utilisant les types "Wagon" et
"Train".

Par contre, si ta question est "Faut-il utiliser la STL ou se taper
l'allocation dynamique de mémoire à la main ?", j'imagine que la
réponse est évidente... ;-)


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Fabien SK
Christophe Brun wrote:
"Zoubidaman" a écrit dans le message de
news:

Vaut-il mieux, quand on a le choix de faire les deux, utiliser les
composants de la STL ou bien se créer une classe?



Mais dans le cas que tu cites (vaut-il mieux une pair< int, int > ou une
classe avec deux membres int), la réponse doit être plus circonstanciée. La
classe pair< T, U > implémente les opérateurs de comparaison et
d'affectation. Si tu es certain de ne jamais avoir besoin que de ces
méthodes pour les objets portés par ton vector, il me semble plus simple
d'utiliser la pair de la STL.


Il faut voir aussi la lisibilité. Une personne qui relit le code pourra
se demander ce qu'étaient le "first" et le "second" de la paire. Vaut
mieux faire un:

struct toto
{
int age;
float amount;
};

Qui a des noms de membres quand même plus parlants.


Avatar
kanze
(Zoubidaman) wrote in message
news:...

je me posais la question suivante :

Vaut-il mieux, quand on a le choix de faire les deux, utiliser les
composants de la STL ou bien se créer une classe?


L'un n'exclut pas l'autre.

Ex: pour stocker une liste de 2 nombres, on peut faire un vecteur de
paires

vector<pair<int,int> > test;

Mais on peut aussi créer une classe et faire un vecteur de cette
classe:

class toto
{
int i,j;
}
toto foo;

vector<foo> test;

Enfin, voilà c'est un exemple, mais ce à quoi je pense serait plutôt
des listes et des maps...

Donc ce que je voudrais savoir, c'est si plus rapide d'utiliser la STL
ou les classes... voilà tout


Tout dépend de ce que tu fais. En gros, si quelque chose fait partie de
l'abstraction de ton application, tu dois en définir une classe, avec
l'interface exacte qui convient. STL n'est pas fait pour ça -- elle ne
pourrait pas l'être, puisque l'interface exacte va dépendre de ton
application, et de ta façon de l'implémenter. En revanche, rien
n'empeche à utiliser la STL dans l'implémentation de ta classe.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
zoubidaman
Eh bien merci pour vos éclaircissements...

Etant donné que dans le cas qui se présente à moi je n'utilise que les
fonctions associées à la STL (comparaison, sort...), je vais en rester
à la STL.

Quant à first et second, je me dis que si moi, débutant en C++, je
sais à quoi ça correspond, quelqu'un de plus habitué saura de quoi ça
parle...

Merci encore...
Avatar
Vincent Lascaux
Quant à first et second, je me dis que si moi, débutant en C++, je
sais à quoi ça correspond, quelqu'un de plus habitué saura de quoi ça
parle...


Le problème c'est pas de savoir si first correspond bien au premier membre
de la paire ou au second. Ca, effectivement, quelqu'un de moins habitué que
toi le saura aussi (s'il a fait un peu d'anglais de base).
Le problème c'est de savoir ce que représente le premier membre. A moins de
documenter chaque ligne pour le préciser, c'est très simple de perdre le
lecteur de ton code. Si tu utilises plusieurs paires dans ton code, tu auras
des first qui ne stoquent pas la même information. Et puis first c'est pas
très explicite comme nom de variable...

--
Vincent

Avatar
Fabien LE LEZ
On Wed, 23 Jul 2003 23:22:17 +0200, "Vincent Lascaux"
wrote:

Et puis first c'est pas
très explicite comme nom de variable...


Je confirme... Perso, j'utilise std::pair<> uniquement à cause des
itérateurs de std::map<>, et déjà là c'est pas très lisible.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
zoubidaman
"Vincent Lascaux" wrote in message news:<3f1efc81$0$22724$...
Quant à first et second, je me dis que si moi, débutant en C++, je
sais à quoi ça correspond, quelqu'un de plus habitué saura de quoi ça
parle...


Le problème c'est pas de savoir si first correspond bien au premier membre
de la paire ou au second. Ca, effectivement, quelqu'un de moins habitué que
toi le saura aussi (s'il a fait un peu d'anglais de base).
Le problème c'est de savoir ce que représente le premier membre. A moins de
documenter chaque ligne pour le préciser, c'est très simple de perdre le
lecteur de ton code. Si tu utilises plusieurs paires dans ton code, tu auras
des first qui ne stoquent pas la même information. Et puis first c'est pas
très explicite comme nom de variable...


Donc effectivement dans ce cas là, l'utilisation d'une classe se
révéle plus judicieuse...

Néanmoins, utiliser la STL permet également d'éviter de créer
plusieurs classes "identiques" mais ne différant que par leurs noms de
variables...

Ex:
class foo {
int toto;
int tata;
};

class foo2 {
int titi;
int tutu;
};

Et là c'est le débutant qui vous pose la question suivante:
est-il d'usage courant de créer des classes identiques, ne différant
que par le nom de leurs variables?? Car on donne un nom de variable
correspondant généralement à l'utilisation qu'on fait de la classe
dans le code. Donc si on a besoin d'une classe identique, mais que les
noms des variables n'ont plus grande signification, je serais tenté
d'en créer une nouvelle, mais avec des noms de variables différents...
Ca se fait ça???

Merci d'avance!!


Avatar
Michael Monerau
Zoubidaman wrote:
class toto
{
int i,j;
}
toto foo;

vector<foo> test;


Juste une petite remarque en passant... Ici, ce que tu as écrit ne compile
pas. Tu ne dois pas mettre un objet en argument du template... Donc ce code

class toto
{
int i,j;
}

vector<toto> test;

voili :)
Bon courage pour apprendre !
--
<=-Michaël"Cortex" Monerau.-=>

Avatar
zoubidaman
Oui, effectivement, une erreur d'inatention ;)