find_if (c.begin();c.end(); prédicat)

find_if (c.begin();c.end(); prédicat) - C++ - Programmation

Marsh Posté le 21-06-2003 à 03:22:53    

Bonjour,  
 
voilou j'aimerais savoir si dans ma liste de float, j'ai un nb plus petit que 0.02
 
je pensais faire ca  
 

Code :
  1. bool carre :: verif_position(list<float> lx, list<float> ly)
  2. {
  3. bool sup (int);
  4.         bool sup (int n)
  5.        {
  6.        return (n>0.02);
  7.        }
  8.        if (find_if (lx.begin(),lx.end(),sup))
  9.     cout << "\n\nj'ai trouveeeeeeeeeeeeeeeeeeeeeeeee";
  10. }


 
si je fais ca j'ai une erreur de déclaration  
 
et si je met la fonction sup en dehors de ma fonction menbre tout en restant dans le meme fichier que ma fonction menbre, et bien j'ai une Illégal structure comme message d'erreur...
 
a moins de parcourir ma liste avec un iterateur, n'y a t'il pas un algo que je puisse utiliser pour que ce soit un peu plus propre...


Message édité par weed le 21-06-2003 à 03:23:17
Reply

Marsh Posté le 21-06-2003 à 03:22:53   

Reply

Marsh Posté le 21-06-2003 à 08:28:03    

1. tu peux pas déclarer une fonction dans une autre
2. find_if retourne un itérateur sur la position (ou end() si y a rien)
 
tu peux utiliser les functor existant:
 

Code :
  1. std::list<float>::const_iterator iter = std::find_if (lx.begin (), lx.end (), std::bind2nd (std::less<float> (), 0.02));
  2. if (iter != lx.end ())
  3. {
  4.    // trouvé
  5. }

 

Reply

Marsh Posté le 21-06-2003 à 10:08:06    

magnifique  :love:

Reply

Marsh Posté le 21-06-2003 à 12:00:21    

c'est là qu'on se rend compte que le C++ n'a rien a voir avec le C [:ddr555]

Reply

Marsh Posté le 21-06-2003 à 19:59:36    

polo021 a écrit :

c'est là qu'on se rend compte que le C++ n'a rien a voir avec le C [:ddr555]


oui c génial la stl ou le c++ ms encore faut il le maitriser  
 
en fait il faudrait mes coordonées x soit comprise entre 0.02 et 0.80, j'ai créé 2 iterateurs ms c'est pas bien propre ...
 

Code :
  1. bool carre :: verif_position(list<float> lx, list<float> ly)
  2. {
  3.   list<float>::iterator gauche, droite;
  4.   gauche = find_if (lx.begin (), lx.end (), bind2nd (std::less<float> (), 0.02));
  5.   droite = find_if (ly.begin (), ly.end (), bind2nd (std::greater<float> (), 0.80));
  6.   if (gauche != lx.end() && droite != lx.end())
  7.     return true;
  8.   else
  9.     return false;
  10. }


ca fonctionne tres tres bien, mais j'aimerais savoir s'il n'y avait pas une autre possibilités ...
j'ai vu sur un site que l'on pouvait utiliser greater_than_, less_than_. j'ai essayé mais cela fonctionne pas .... Je pensais utiliser cette methode et faire un et logique ...
 
Cela fonctionne tres bien dc c pas bien grave s'il n'y a pas trop de solution ....
 
sinon l'équivalent d'un delete d'un char *, c'est bien un  
coordx.erase(coordx.begin(),coordx.end() )  
qu'il faut faire dans le destructeur pour liberer la memoire, parce ce que je sens qu'il va falloir que j'en fasse car j'ai été souvent obligé de fermer la session() pour vider ma RAM


Message édité par weed le 21-06-2003 à 20:01:53
Reply

Marsh Posté le 21-06-2003 à 20:03:56    

ca n'a rien a voir, mais evite de passer des list par valeurs. tu te retapes une copie à chaque fois sinon.

Reply

Marsh Posté le 21-06-2003 à 20:21:10    

zut quel erreur de débutant il fallait que je fasse un ou  
 

Code :
  1. if (gauche != lx.end() || droite != lx.end())
  2.    return true;
  3. else
  4.    return false;


j'ai choisi la list car j'ai pas mal de push_back à faire ....
je ne comprends pas ta remarque, de toute facon avec un find ou tout autre algo de recherche je suis obligé de parcourir le "tableau" en entier ... non ???

Reply

Marsh Posté le 21-06-2003 à 20:23:47    

c'est pas le choix de list que je critique, c'est le passage par valeur.  
bool verif_position(list<float> lx, list<float> ly) à chaque appel les deux listes que tu passes sont copiées.
 
bool verif_position(const list<float>& lx, const list<float>& ly) tu passes par référence constante, pas de copie.

Reply

Marsh Posté le 21-06-2003 à 20:35:28    

oui en effet j'avais pas pensé a ca ....
il faut que j'essaie d'oublier le passage par copie. En effet les listes sont copiés dans un espace mémoire pour etre utilisé dans la fonction ... Du coup une liste de 50 float, ca fait beaucoup.  
 
Alors que le passage par pointeur/référence on transmet l'adresse du premier élément, bon lol il faut pas trop que je m'avance la-dessus, apres je risque me tromper  :wahoo:

Reply

Marsh Posté le 21-06-2003 à 20:49:49    

arf zut je peux pas utiliser de const ...
 
si je le mets j'ai ca comme erreur  

Citation :

Error:  carre.cpp(107,11):Cannot convert 'std::list<float>::const_iterator' to 'std::list<float>::iterator'


 
visiblement il faut que j'utilise un iterateur const donc je fais ca :

Code :
  1. const list<float>::iterator gauche, droite;


 
mais apres j'ai ce message d'erreur  

Citation :

Error:  carre.cpp(107,11):Cannot modify a const object


je ne peux pas utilisé de const pour l'itérateur et donc ds les parametres ....
l'idéal serait essayer de mettre les list en lecture, ms la visiblement c pas possible ....
pas grave je ferais attentions a ne pas modifier mes list accidentellement
 
EDIT : dc j'utilise :

Code :
  1. bool verif_position(list<float>& lx, list<float>& ly)


Message édité par weed le 21-06-2003 à 20:50:54
Reply

Marsh Posté le 21-06-2003 à 20:49:49   

Reply

Marsh Posté le 21-06-2003 à 21:16:59    

Code :
  1. bool carre :: verif_position(const std::list<float>& lx)
  2. {
  3.   const std::list<float>::const_iterator it = std::find_if (lx.begin (), lx.end (), std::compose2(std::logical_or<bool>(),std::bind2nd (std::less<float> (), 0.02),std::bind2nd (std::greater<float> (), 0.80)));
  4.   if (it == lx.end())
  5.     return true;
  6.   else
  7.     return false;
  8. }


 
:D


Message édité par verdoux le 21-06-2003 à 21:36:20
Reply

Marsh Posté le 22-06-2003 à 00:49:11    

mouaip ... j'y connais po grand chose en C++ et stl, mais tant qu'à faire t'aurais pu utiliser une list de vector plutot que lx et ly; c quand meme plus portable d'avoir une dimension variable;
 
et pis le 0.02 et 0.80 direct dans le corps de la fonction : bouh c po beau du tout !
 
rq: sinon pour faire des trucs aussi simples, le c c'est pas mal


Message édité par Deaddy le 22-06-2003 à 00:51:25
Reply

Marsh Posté le 22-06-2003 à 00:59:01    

bahh mes constante sont ds mon fichier main.cpp malheuresement en global a cause de l'opengl  
j'ai essayé de faire un  

Code :
  1. extern float bas_cadre_x  = 0.02, bas_cadre_y  = 0.03;
  2. extern float haut_cadre_x = 0.80, haut_cadre_y = 0.98;


ms sans succes les variables sont inconnu ds mon fichiers ou j'ai mis mes fonctions menbres .....
 
si j'ai le temps j'essairais de lire un fichier comme ca l'utilisateur pour meme choisir.    
 
 
 
 
 

Citation :

mais tant qu'à faire t'aurais pu utiliser une list de vector


euhh je te suis pas, j'y connais pas trop en STL, tu veux parler du conteneur vector ?

Reply

Marsh Posté le 22-06-2003 à 04:24:31    

Citation :

bahh mes constante sont ds mon fichier main.cpp malheuresement en global a cause de l'opengl


 
Je ne vois pas trop le rapport avec OpenGL.
 
A moins qu'il y ait une ellipse dans ton discours que je n'ai pas vu ;).
 

Citation :

j'ai essayé de faire un  

Code :
  1. extern float bas_cadre_x  = 0.02, bas_cadre_y  = 0.03;
  2. extern float haut_cadre_x = 0.80, haut_cadre_y = 0.98;


ms sans succes les variables sont inconnu ds mon fichiers ou j'ai mis mes fonctions menbres .....


 
il ne suffit pas de mettre extern dans la translation unit qui "contiendra" les variables globales
encore faut-il aussi faire une declaration prealable
dans les translation unit qui les utiliseront.
(un petit bouquin de C ne serait pas de trop ?)
 
dans monfich.cpp (la declaration extern est optionnelle):

Code :
  1. extern float bas_cadre_x  = 0.02, bas_cadre_y  = 0.03;
  2. extern float haut_cadre_x = 0.80, haut_cadre_y = 0.98;


 
dans monbidule.cpp :

Code :
  1. extern float bas_cadre_x, bas_cadre_y;
  2. extern float haut_cadre_x, haut_cadre_y ;


 
C'est la qu'est le trick: tu n'as le droit d'affecter une valeur a variable globale que dans une seule translation unit (c'est logique) meme si c'est la meme valeur (c'est moins logique). Et á chaque fois que tu ecriras extern nom_de_variable; c'est a cette variable déclarée dans le premier fichier que tu feras reference.
Ensuite ce sera a l'edition des liens qu'on rabibochera les differents morceaux et les symboles.
 
Apres tu apprendras a utiliser les namespaces,
les membres de classe statiques, les accesseurs etc...
 
LeGreg

Reply

Marsh Posté le 22-06-2003 à 09:01:17    

un accesseur (writer ou reader en anglais je crois) sont des fonctions menbres permettant d'acceder au variable private ou protected dans la meme classe.
 
un namespaces est espace de nom regroupant un ensemble de class. Ansi je pourrai utiliser ma classe toto :: <list> float i; sans creer de conflit avec la STL.  
 
les membres de classe statiques, variable statique défini pour toutes les classes ou pas ?
 
 
je vois donc pas trop le rapport entre ce que tu me racontes que j'apprendrai tel truc avec mon problème. Je veux bien ms il faut que l'on m'explique.
 
 
Pourquoi je parle de opengl. Et bien pour ta gourverne, si tu n'as jamais utilisé cette biblio, il faut que je mette toutes mes fonctions menbres d'affichage (exemple : cadre.affiche(); ) dans ma fonction display ();  
la fonction display () est appellé par glutDisplayFunc(display)(void);
Pourquoi suis je obligé de me mettre en global ?

  • je ne peux pas passer de valeur ds glutDisplayFunc dont le proptotype est glutDisplayFunc(* ft)(void)  
  • je ne peux pas déclarer mes variables ds ma fonction display() car elle est lancé en boucle par un glutPostRedisplay();. si je le faisais il y aurait a chaque fois création d'objet, variable

==> global
 

Code :
  1. void display (void)
  2.    //affichage des objets   
  3.  
  4.   glutPostRedisplay();
  5. }


 
 
cf http://forum.hardware.fr/forum2.ph [...] 86#t435486
 
 

Reply

Marsh Posté le 22-06-2003 à 09:11:03    

a oui je me souviens now un peu ...
 
y a les declarations et les ....... (arf le mot m'echappe)
 
 

Reply

Marsh Posté le 22-06-2003 à 09:14:42    

weed a écrit :

un accesseur (writer ou reader en anglais je crois) sont des fonctions menbres permettant d'acceder au variable private ou protected dans la meme classe.
 
un namespaces est espace de nom regroupant un ensemble de class. Ansi je pourrai utiliser ma classe toto :: <list> float i; sans creer de conflit avec la STL.  
 
les membres de classe statiques, variable statique défini pour toutes les classes ou pas ?
 
je vois donc pas trop le rapport entre ce que tu me racontes que j'apprendrai tel truc avec mon problème. Je veux bien ms il faut que l'on m'explique.


 
Et bien c'est bien, donc tu as les bases mais tu dois encore apprendre a quoi ca sert.
 
Le namespace t'evites lorsque tu as des noms definis au niveau global qu'ils collisionnent avec des noms d'autres librairies.
 
En general les developpeurs aiment bien utiliser des noms simples comme foo ou toto, et si tu essaies de lier deux modules qui ont un nom en commun tu es *biaisé*.  
De plus si tu es paranoiaque et que tu as un nom de variable que tu ne veux pas pouvoir utiliser en dehors de ton module, tu peux le declarer dans un namespace anonyme.
 
Une maniere propre d'avoir des globales c'est de les mettre comme membre statiques d'une classe et de les acceder uniquement par des accesseurs plutot que directement en tapant leur adresse. (par exemple)
 
LeGreg

Reply

Marsh Posté le 24-06-2003 à 00:44:28    

toujours ds le cas d'une recherche, 'y a til pas un algo de recherche pour trouver une suite de 4 nombres  
 
par exemple ds ma list A, j'ai :
2 5 6 2 8 9 4 5 3 1 45
 
et je souheterais trouver la suite  8 9 4 5
je fais une recherche ds la list A et si je la trouve je l'efface ds A :  2 5 6 2 3 1 45
 
je sens que ca va pas etre possible avec un truc tout fait et qu'il va falloir que je fasse une petite surcharge de == en parcourant la liste  .... grhhhhh

Reply

Marsh Posté le 24-06-2003 à 02:23:15    

8 9 4 5 saont ds une liste aussi 8 9 4 5 7 8 6 2  
et je dois comprare par segments de 4 elements ....
 
c trop de la balle  
j'ai trouvé

Code :
  1. bool operator==(const list&,
  2.                 const list& )

sur http://www.sgi.com/tech/stl/List.html
 
 
ce que je fais tout simplement je creer  alors  
je copie une sequence de 4 eleme,nt avec la fonction copy  
dans une liste dont j'aurais definis la taille à 4 pour optimiser et j'utilise cette nouvelle liste pour faire la comparaison avec la surcharge ==

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed