GNT sans publicité, site mobile, fonctionnalitées exclusives...

L'enfer de la STL

Le
Alain Ketterlin
Salut,

J'utilise pas mal la STL, avec des combinaisons du genre :

map < pair<Truc*,Truc*> , set<Truc*> > m;

(pour la plus simple). Pour diverses raisons, j'essaie d'éviter les
typedef. Donc je me retrouve avec des boucles comme :

for ( map < pair<Truc*,Truc*> , set<Truc*> >::iterator it=m.begin() ;
it!=m.end() ; it++ )
{ }

D'où mes deux questions :

1) y a-t-il plus court ? (Hors for_each, qui ne m'intéresse pas parce
que mes corps de boucle sont éventuellement longs, et je n'ai pas
envie de les rejeter chacun dans une classe.)

2) Quelqu'un a-t-il des informations sur la standardisation
(éventuelle) et l'implémentation de "auto" dans g++ ? Je n'ai rien
trouvé de précis. Quand pourrais-je écrire
for ( auto it=m.begin() ; it!=m.end() ; it++ )


Question subsidiaire : en essayant d'écrire une macro pour remplacer
la tête de boucle ci-dessus, j'ai remarqué que le préprocesseur ne
connait rien aux templates. Si j'écris

#define FOREACH(T,c,v) for ( T :: iterator v=c.begin() )

alors il couine sur

FOREACH(pair<Truc1,Truc2>,m,it)

parce qu'il ne comprend pas que la première virgule est entre < et >.
Savez-vous si il est prévu que ça change ?

Merci d'avance. J'espère avoir raté quelque chose d'évident.

-- Alain.
Lire les 27 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 6
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #17767021
Alain Ketterlin
J'utilise pas mal la STL, avec des combinaisons du genre :

map < pair<Truc*,Truc*> , set<Truc*> > m;

(pour la plus simple). Pour diverses raisons, j'essaie d'éviter les
typedef. Donc je me retrouve avec des boucles comme :

for ( map it!=m.end() ; it++ )
{ ... }

D'où mes deux questions :

1) y a-t-il plus court ? (Hors for_each, qui ne m'intéresse pas parce
que mes corps de boucle sont éventuellement longs, et je n'ai pas
envie de les rejeter chacun dans une classe.)



Pas que je sache.

Question subsidiaire : en essayant d'écrire une macro pour remplacer
la tête de boucle ci-dessus, j'ai remarqué que le préprocesseur ne
connait rien aux templates. Si j'écris

#define FOREACH(T,c,v) for ( T :: iterator v=c.begin() ... )

alors il couine sur

FOREACH(pair<Truc1,Truc2>,m,it)

parce qu'il ne comprend pas que la première virgule est entre Savez-vous si il est prévu que ça change ?



Il n'est pas prevu que ca change (conceptuellement le preprocesseur
fonctionne a un moment ou il est impossible de savoir si pair est un
template ou pas.

Sauf erreur de ma part,

FOREACH((pair<Truc1,Truc2>), m, it)

devrait fonctionner.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++...index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Alain Ketterlin
Le #17767131
Jean-Marc Bourguet
Alain Ketterlin
#define FOREACH(T,c,v) for ( T :: iterator v=c.begin() ... )

alors il couine sur

FOREACH(pair<Truc1,Truc2>,m,it)

parce qu'il ne comprend pas que la première virgule est entre Savez-vous si il est prévu que ça change ?



Il n'est pas prevu que ca change (conceptuellement le preprocesseur
fonctionne a un moment ou il est impossible de savoir si pair est un
template ou pas.



Oh j'espérais plus simple, du genre considérer comme atomique ce qui
se trouve entre une option, puique GNU cpp a déjà -x et -std.

Sauf erreur de ma part,

FOREACH((pair<Truc1,Truc2>), m, it)

devrait fonctionner.



Malheureusement non, impossible de caser un type entre parenthèse.

Merci pour ton aide.

-- Alain.
Jean-Marc Bourguet
Le #17767541
Alain Ketterlin
Jean-Marc Bourguet
> Alain Ketterlin >> #define FOREACH(T,c,v) for ( T :: iterator v=c.begin() ... )
>>
>> alors il couine sur
>>
>> FOREACH(pair<Truc1,Truc2>,m,it)
>>
>> parce qu'il ne comprend pas que la première virgule est entre >> Savez-vous si il est prévu que ça change ?
>
> Il n'est pas prevu que ca change (conceptuellement le preprocesseur
> fonctionne a un moment ou il est impossible de savoir si pair est un
> template ou pas.

Oh j'espérais plus simple, du genre considérer comme atomique ce qui
se trouve entre une option, puique GNU cpp a déjà -x et -std.

> Sauf erreur de ma part,
>
> FOREACH((pair<Truc1,Truc2>), m, it)
>
> devrait fonctionner.

Malheureusement non, impossible de caser un type entre parenthèse.



Il y a des endroits dans les types ou on peut mettre des parentheses,
mais pas dans ce qui qualifie les noms.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++...index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Fabien LE LEZ
Le #17770161
On Thu, 06 Nov 2008 17:29:52 +0100, Alain Ketterlin

map < pair<Truc*,Truc*> , set<Truc*> > m;



typedef est ton ami.
Mickaël Wolff
Le #17770501
Alain Ketterlin a écrit :
(pour la plus simple). Pour diverses raisons, j'essaie d'éviter les
typedef. Donc je me retrouve avec des boucles comme :



Quels peuvent être les raisons qui peuvent pousser à ne pas employer
une technique propre ?

2) Quelqu'un a-t-il des informations sur la standardisation
(éventuelle) et l'implémentation de "auto" dans g++ ? Je n'ai rien
trouvé de précis. Quand pourrais-je écrire
for ( auto it=m.begin() ; it!=m.end() ; it++ ) ...



Ce n'est visiblement pas encore implémenté


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Publicité
Suivre les réponses
Poster une réponse
Anonyme