std :: list<float> :: iterator iy = c.coordx.beging()

std :: list<float> :: iterator iy = c.coordx.beging() - C++ - Programmation

Marsh Posté le 03-07-2003 à 16:19:03    

j'arrive pas incrementer de 4 directement
pour tant un iterateur est comme un pointeur
donc logiquement je ca pourras fonctionner  
j'ai essayer ds le for ou à l'exterieur rien à y faire toujours  
"Illegal operation" comme erreur
bien sur si je    
 

Code :
  1. std :: list<float> :: iterator il,iy;
  2. for (il=coordx.begin();il!=coordx.end();)
  3. {
  4.    cout << "yop";
  5.    il=il+4;
  6. }


voilou pour l'instant j'ai trouvé que ca comme parade ms je trouve pas ca tres propre
 

Code :
  1. std :: list<float> :: iterator il,iy;
  2.    for (il=coordx.begin();il!=coordx.end();)
  3.    {
  4.         cout << "yop";
  5.         il++;
  6.         il++;
  7.         il++;
  8.         il++;
  9.    }


je pourrais meme je pense faire ca ms c tjrs pas tres beau  
 

Code :
  1. std :: list<float> :: iterator il,iy;
  2.    for (il=coordx.begin();il!=coordx.end();il++,il++,il++,il++)
  3.    {
  4.         cout << "yop";
  5.    }


Message édité par weed le 03-07-2003 à 16:45:04
Reply

Marsh Posté le 03-07-2003 à 16:19:03   

Reply

Marsh Posté le 03-07-2003 à 16:23:00    

Tu peux surcharger l'opérateur += en y mettant n itération
 
Apres tu pourrais utiliser il+=4;

Reply

Marsh Posté le 03-07-2003 à 16:28:28    

euhh comprends pas il faut surcharger iterateur.
et pq j'ai pas besoin de sucharger l'iterateur ++, c'est deja fait .......
 
arf bon je sens que je vais fais 4 fois il++ car j'ai la fleme de le faire

Reply

Marsh Posté le 03-07-2003 à 16:35:05    

je viens de penser a ca  
comment puis affecter un iterateur avec un objet externe  
 

Code :
  1. iy = c.coordx.beging()


 
 

Code :
  1. bool baton :: operator== (const baton &c)
  2. {
  3. std :: list<float> :: iterator il,iy;
  4.    for (il=c.coordx.begin();il!=coordx.end();)
  5.    {
  6.         il++; il++; il++;  il++;
  7.    }
  8. }


Reply

Marsh Posté le 03-07-2003 à 16:38:19    

Bon je recommence.
 
Ce que tu peux faire, pour te faciliter la vie, c'est de surcharger un operateur (ou de creer une fonctions globale... enfin bref comme tu veux) comme ca grosso modo :

Code :
  1. classe::operator+= (int n)
  2. {
  3.   for ( int i=1; i<=n ; i++ ) *this++;
  4. }


Bon je suis pas certain que ce que j'ai ecrit soit exacte, mais c'est l'idée dont il est question

Reply

Marsh Posté le 03-07-2003 à 16:44:18    

oki  
 
 
as tu une idée pour affecter ma liste coordx de l'objet c ds il qui est un ierateur  
 

Reply

Marsh Posté le 03-07-2003 à 17:04:05    

:non:  
1) pour les iterateurs, toujours utiliser ++it  
2) solution simple advance http://www.sgi.com/tech/stl/advance.html

Reply

Marsh Posté le 03-07-2003 à 17:10:35    

Une liste n'est pas "random access" donc c'est normal que ca te renvoit un iterator bi-directionnel seulement et non "random access" (comme le fait un vector ou un deque).
Donc avec une list tu n'as jamais la possibilité d'utiliser +=, -=, +, etc.
 
A mon avis, si ton utilisation n'est pas isolée, tu ferais bien de considerer les vecteurs à la place des lists parce que l'utilisation que tu fais là, c'est celle d'un vecteur.


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 03-07-2003 à 17:12:08    


 
Superbe :love:


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 03-07-2003 à 17:16:52    

ne jamais dire/penser 'y a pas dans STL'  ;)

Reply

Marsh Posté le 03-07-2003 à 17:16:52   

Reply

Marsh Posté le 03-07-2003 à 17:17:33    

merci pour la fonction advance, taz
 
ms j'ai tjrs le pb avec ma sucharge  
 
bool operator== (const baton & );
 
ds ma classe baton j'ai en autre coordx, coordy;
     

Code :
  1. class baton
  2. {
  3. private :
  4.       char orientation;
  5.       //std :: list<baton>  coord;
  6.    protected :
  7.     float pas;
  8.       float x, y;
  9.       list<float>  coordx, coordy;
  10.    .......
  11.    ......
  12. }


 
j'aimerais dc faire dc acceder coordx et coordy de l'objet c de type baton qui est passé en parametre ...  
comment je fais pour affecter un iterateur l'adresse du premier element de ma liste coordx ?  
 

Code :
  1. il = c.coord.begin();


ms ca fonctionne pas et je vois trop comment faire  
 
bool baton :: operator== (const baton &c)
{
 std :: list<float> :: iterator il,iy;
}


Message édité par weed le 03-07-2003 à 17:19:35
Reply

Marsh Posté le 03-07-2003 à 17:23:08    

this et c/other/rhs sont const, il faut donc utiliser des const_iterator des deux cotés.

Reply

Marsh Posté le 03-07-2003 à 17:39:50    

grhhhhhh j'ai déja fait l'erreur en plus  
logique en regardant les parametres ....
 
oui ms ce que tu dis ce de me mettre en const ms apres je ne peux plus faire varier les iterator ds mon  for ...
 
ce que je vais faire retirer tout les const et je vais declarer un objet ds mon fonction qui prendra comme valeur l'objet c  

Code :
  1. baton tmp(c);


 
et dc comme ca je pourrais manipulé tmp qui est une copie de c san rien modifié à c...

Reply

Marsh Posté le 03-07-2003 à 19:15:54    

laisse tout en const et utilise des const_iterator et pas des const iterator

Reply

Marsh Posté le 04-07-2003 à 01:31:01    

ca a rien a voir, mais ca me serait utile : personne connait un genre de randomized_iterator pour des map, où on accèderait aux éléments parfaitement au hasard, par exemple avec un :
 
for (i = mymap.begin(); i != mymap.end(); i++)
 
où on parcourerait tous les éléments de la map dans un ordre 'suffisamment' hasardeux.
 
chuis ouvert à toutes les solutions, meme batardes, mais le plus rapide possible...

Reply

Marsh Posté le 04-07-2003 à 01:40:21    

arf je connais pas bien map  
ms ce que j'ai fais c'est avec les vector que j'ai utilisé avec les indices et j'ai fait un genre de  
 

Code :
  1. vector <int> toto;
  2. toto[random(toto.size()];

Reply

Marsh Posté le 04-07-2003 à 01:45:04    

weed a écrit :

arf je connais pas bien map  
ms ce que j'ai fais c'est avec les vector que j'ai utilisé avec les indices et j'ai fait un genre de  
 

Code :
  1. vector <int> toto;
  2. toto[random(toto.size()];




 
random n'est pas une fonction qui existe.
Manque une parenthese.
Le môsieur te demande pour des map<> pas des vectors.

Reply

Marsh Posté le 04-07-2003 à 01:46:06    

konar_spreme a écrit :


 
random n'est pas une fonction qui existe.
Manque une parenthese.
Le môsieur te demande pour des map<> pas des vectors.


 
et aussi un iterator, pas un accès unique débile.

Reply

Marsh Posté le 04-07-2003 à 01:50:05    

ce qui est loin d'etre aléatoire surtout avec une telle utilisation
 
 

Code :
  1. (unsigned)((double)std::rand()/((double)RAND_MAX+1)*N);


 
est bien mieux  
 
pour répondre à ta question
 
http://www.sgi.com/tech/stl/random_shuffle.html
 
sinon il y a l'extension de SGI qui marche bien
http://www.sgi.com/tech/stl/random_sample.html
http://www.sgi.com/tech/stl/random_sample_n.html
 
 
edit: evidemment on comprends bien qu'il faut des RandomAccessIterator pour tous ça


Message édité par Taz le 04-07-2003 à 01:51:45
Reply

Marsh Posté le 04-07-2003 à 01:52:13    

oki je pensais pas que c'etait null le random

Reply

Marsh Posté le 04-07-2003 à 01:57:19    

je connais le random_shuffle, mais a moins d'une ratance de ma part, j'ai pas réussi a l'utiliser avec des map (normal : map == élts triés), donc je copie tous les élts de ma map ds un vector puis je random_shuffle ce dernier puis je parse, mais : le random_shuffle est supra rapide mais la copie map -> vector prend trop de temps.
 
vais jeter un rapide coup d'oeil vers tes 2 autres liens.
 
par contre a mon avis c'est dommage qu'une implémentation d'un tel iterator random soit absente...

Reply

Marsh Posté le 04-07-2003 à 01:57:40    

weed a écrit :

oki je pensais pas que c'etait null le random

ben c'est rand et pas random et utilisais comme tu le fais, c'est loin d'etre efficace. allez voir dans boost:: les générateurs de nombres pseudo-aléatoires sont légions et très bien foutus http://boost.org/libs/random/index.html

Reply

Marsh Posté le 04-07-2003 à 01:59:48    

Konar a écrit :

je connais le random_shuffle, mais a moins d'une ratance de ma part, j'ai pas réussi a l'utiliser avec des map (normal : map == élts triés), donc je copie tous les élts de ma map ds un vector puis je random_shuffle ce dernier puis je parse, mais : le random_shuffle est supra rapide mais la copie map -> vector prend trop de temps.
 
vais jeter un rapide coup d'oeil vers tes 2 autres liens.
 
par contre a mon avis c'est dommage qu'une implémentation d'un tel iterator random soit absente...

mais pour avoir un random_iterator il faut qu'on puisse avoir un accès aléatoire!!!!! si tu veux faire ça avec une map, faut que tu maintiennes à coté dans un vector la liste des clefs et apres tu pioches dedans
 
eidt: et j'avais édité


Message édité par Taz le 04-07-2003 à 02:00:39
Reply

Marsh Posté le 04-07-2003 à 02:05:47    

++Taz a écrit :

ben c'est rand et pas random et utilisais comme tu le fais, c'est loin d'etre efficace. allez voir dans boost:: les générateurs de nombres pseudo-aléatoires sont légions et très bien foutus http://boost.org/libs/random/index.html


 
désolé pour la soluce win32-only, mais pour un nb presque parfaitement aléatoire, y a le QueryPerformanceCounter() ki retourne un nb 64 bits correspondant au nb de cycles cpu depuis le boot de l'os.

Reply

Marsh Posté le 04-07-2003 à 02:08:20    

franchement jetez un oeil à boost, les periodicités des générateurs sont impressionnantes

Reply

Marsh Posté le 04-07-2003 à 02:12:11    

++Taz a écrit :

mais pour avoir un random_iterator il faut qu'on puisse avoir un accès aléatoire!!!!! si tu veux faire ça avec une map, faut que tu maintiennes à coté dans un vector la liste des clefs et apres tu pioches dedans


 
c'est vrai que la, un accès random sur une map, après reflexion ca veut un peu rien dire, c'est pas très logique tout ca.
 
quoique... apparemment on m'a dit que l'implémentation d'une map ds certaines stl (celle de ms pour ne pas la citer) se faisaient avec un simple arbre n-aire, donc où un accès random veut dire qqchose.
 
vais aller dormir et mediter sur tout ca tiens...

Reply

Marsh Posté le 04-07-2003 à 02:16:04    

non c'est pas possible d'avoir un acces aléatoire avec un arbre. ou alros tu peux simuler, mais ça sera tres tres mauvais au niveau de la répartition
 
edit: et puis niveau performance, c'est la mort... tu te tapes une descente d'arbre à chaque fois. je sais pas si t'imagines l'impact sur les performances :ouch: .


Message édité par Taz le 04-07-2003 à 02:20:31
Reply

Marsh Posté le 04-07-2003 à 02:26:24    

++Taz a écrit :

non c'est pas possible d'avoir un acces aléatoire avec un arbre. ou alros tu peux simuler, mais ça sera tres tres mauvais au niveau de la répartition


 
2 sec ke je tentes de mettre le pseudo-neurone en état de marche...
 
me rappelle juste d'un cours ou on nous parlait de mettre un arbre sous forme de liste chainée (me rappelle plus, me semble peu possible d'ailleurs a 1ère vue), mais ou donc un accès aléatoire serait possible.
 
sinon c'est clair qu'un accès aléatoire ds un vrai arbre me semble ratant, mais me demande a quel dégré par rapport au reste.

Reply

Marsh Posté le 04-07-2003 à 02:29:56    

euh l'acces aléatoire dans la liste oui, mais à quel prix  :ouch:

Reply

Marsh Posté le 04-07-2003 à 02:39:01    

++Taz a écrit :

euh l'acces aléatoire dans la liste oui, mais à quel prix  :ouch:  


 
bah en fait mon pb est que j'ai une map<string, class X>.
c'est une map, j'y peux rien, c'est comme ca.
 
apres faut que j'extrais au hasard les infos de la class X dans un ordre aléatoire, a hauteur d'un nombre N.
 
juska présent je copie en entier la map ds un vector puis je random_shuffle ce dernier et j'en extrais les N premiers.
cette solution est correcte, mais si map.size() > 10000, ca commence a prendre trop de temps cpu, et si map.size() > 100000, va falloir ke je dise au patron de changer son bi P3-800 ki va pas assez vite.
 
donc c'est a moi de trouver mieux (et c'est faisable, la solution présente fouette et je le sais bien...)

Reply

Marsh Posté le 04-07-2003 à 02:47:25    

ben on y peut quoi si tu utilises un conteneur qui te satisfait pas... (déjà moi je te conseille de n'extraire que les clefs). vouloir les éléments dans un ordre et en attaper une poignée au pif sont deux choses pas très compatibles. donc non c'est pas possible. cela dit tu peux tenter une implémentation tabulaire avec make_heap et ce genre de chose et là tu peux piocher sans problème

Reply

Marsh Posté le 04-07-2003 à 02:53:57    

++Taz a écrit :

ben on y peut quoi si tu utilises un conteneur qui te satisfait pas... (déjà moi je te conseille de n'extraire que les clefs). vouloir les éléments dans un ordre et en attaper une poignée au pif sont deux choses pas très compatibles. donc non c'est pas possible. cela dit tu peux tenter une implémentation tabulaire avec make_heap et ce genre de chose et là tu peux piocher sans problème


 
ben en fait c'est tout le pb : moi me fout de la clef, ca concerne le gars ki s'occupe des insertions/suppressions (d'ailleurs ca l'arrange bien ke ca soit des map). moi veux juste récuperer les infos au hasard : tester dans n'importequel ordre si ces infos correspondent a celles attendues, si oui les stocker et passer a la suivante juska atteindre N.
 
m'a l'air d'etre un pb insoluble... demain vais tenter de virer ces map inutiles et les remplacer par un truc mieux, genre un simple vector.
 
edit : me manque un niveau global sinon, c'est quoi ces 'make_heap' ?


Message édité par Konar le 04-07-2003 à 02:56:46
Reply

Marsh Posté le 04-07-2003 à 02:57:31    

mais je sais que tu t'en fout de la clef. cela dit pour piocher t'as pas besoin de tout extraire!!! tu n'extrais que les clefs, tu pioches et apres tu retrouves dans la map la donnée

Reply

Marsh Posté le 04-07-2003 à 03:04:10    

++Taz a écrit :

mais je sais que tu t'en fout de la clef. cela dit pour piocher t'as pas besoin de tout extraire!!! tu n'extrais que les clefs, tu pioches et apres tu retrouves dans la map la donnée


 
la je te suis plus, soit j'ai le neurone qu'a décidé qu'il était temps de mourir, soit me manques un ou plusieurs niveaux en c++ comparé a toi.
 
dans les 2 cas (le 2ème me semble me semble plus approprié), je me réfugie dans mon lit et je te solliciterais surement demain.
 
a+

Reply

Marsh Posté le 04-07-2003 à 03:26:24    

Code :
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <iterator>
  4. #include <vector>
  5. #include <map>
  6. #include <ext/functional> // pour select1st
  7. using namespace std;
  8. using namespace __gnu_cxx; // pour select1st
  9. int main()
  10. {
  11.   map<string, unsigned> months;
  12.  
  13.   months["january"] = 31;
  14.   months["february"] = 28;
  15.   months["march"] = 31;
  16.   months["april"] = 30;
  17.   months["may"] = 31;
  18.   months["june"] = 30;
  19.   months["july"] = 31;
  20.   months["august"] = 31;
  21.   months["september"] = 30;
  22.   months["october"] = 31;
  23.   months["november"] = 30;
  24.   months["december"] = 31;
  25.   vector<string> keys;
  26.   transform(months.begin(), months.end(), back_inserter(keys),
  27.     select1st< map<string, unsigned>::value_type >());
  28.   random_shuffle(keys.begin(), keys.end());
  29.   copy(keys.begin(), keys.end(), ostream_iterator<string>(cout, ", " ));
  30.   // et apres tu pioches
  31.   // tu itereres le vecteur et à chaque fois
  32.   // months[*it] pour recuperer
  33.    
  34. }

Reply

Marsh Posté le 04-07-2003 à 08:17:04    

Konar a écrit :


 
désolé pour la soluce win32-only, mais pour un nb presque parfaitement aléatoire, y a le QueryPerformanceCounter() ki retourne un nb 64 bits correspondant au nb de cycles cpu depuis le boot de l'os.

Sous *nix il y a /dev/random qui est pas mal du tout, et tres simple d'utilisation =)

Reply

Marsh Posté le 04-07-2003 à 09:45:42    

plutot urandom pour eviter l'appel bloquant...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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