Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1764 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Tableau dynamique BOOST

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Tableau dynamique BOOST

n°1872418
spinzero
Posté le 13-04-2009 à 09:00:33  profilanswer
 

Salut  :p  
 
Je cherche à manipuler le plus rapidement possible des tableaux 1D et 2D de taille variable.
...et j'ai pensé à Boost  :ange:  
D'après la doc, il semble que l'utilisation d'array ou multiarray ne concerne que des tableaux de tailles fixes  :cry:  
Est-ce bien vrai, n'y a-t-il pas d'astuces pour gérer des tableaux de taille variable ?
 
merci pour vos précisions...

mood
Publicité
Posté le 13-04-2009 à 09:00:33  profilanswer
 

n°1872420
Joel F
Real men use unique_ptr
Posté le 13-04-2009 à 09:13:32  profilanswer
 

1D dynamqiue : std::vector
2D dynalmique : boost::multi_array
 
Y a que boost::array qui gére des tailles statiques.

n°1872446
spinzero
Posté le 13-04-2009 à 11:39:39  profilanswer
 

Joel F a écrit :

1D dynamqiue : std::vector
2D dynalmique : boost::multi_array
 
Y a que boost::array qui gére des tailles statiques.


 
Ah, je me disais bien que j'avais mal lu, merci Joel F  :D  
Je vais donc revoir ce que j'avais commencé à faire avec multi_array...
Mais à première vue, ce qui semble peu pratique, c'est l'absence d'un push_back , car il faut directement attaquer les positions dans le tableau tab[n][n][...]. Et d'après ce que j'imagine, on doit évaluer le nombre d'éléments ds chaque dimension avant de trouver l'emplacement suivant !?
... et pas d' erase non plus, là par contre je vois pas comment effacer un élément  :ouch:

Message cité 1 fois
Message édité par spinzero le 13-04-2009 à 12:05:36
n°1872453
Taz
bisounours-codeur
Posté le 13-04-2009 à 12:20:17  profilanswer
 

spinzero a écrit :


 
Ah, je me disais bien que j'avais mal lu, merci Joel F  :D  
Je vais donc revoir ce que j'avais commencé à faire avec multi_array...
Mais à première vue, ce qui semble peu pratique, c'est l'absence d'un push_back , car il faut directement attaquer les positions dans le tableau tab[n][n][...]. Et d'après ce que j'imagine, on doit évaluer le nombre d'éléments ds chaque dimension avant de trouver l'emplacement suivant !?
... et pas d' erase non plus, là par contre je vois pas comment effacer un élément  :ouch:


c'est une matrice NxM[...] ça n'a pas de sens de changer la taille d'un élément. Si ton machin c'est plus un tas de spaghettis, alors tu ferais mieux de faire des list de list [...] de vector

n°1872465
spinzero
Posté le 13-04-2009 à 13:36:58  profilanswer
 

Taz a écrit :


c'est une matrice NxM[...] ça n'a pas de sens de changer la taille d'un élément.


Donc même si je voulais modifier la capacité de la 2d colonne du premier élément de ma matrice, cela s'appliquerait à toute les autres.  
Il faut donc fixer les limites dès le début,  même si on ne sait pas quelle sera la quantité de particules (2d col) contenu dans une mollécule(1ere col) ?
 

Taz a écrit :

Si ton machin c'est plus un tas de spaghettis, alors tu ferais mieux de faire des list de list [...] de vector


Ben je voudrais juste associer à chaque assiette (1er col), une quantité variable de spaghettis (2d col)  :whistle:

Message cité 1 fois
Message édité par spinzero le 13-04-2009 à 13:39:34
n°1872467
Taz
bisounours-codeur
Posté le 13-04-2009 à 13:45:41  profilanswer
 

spinzero a écrit :


Donc même si je voulais modifier la capacité de la 2d colonne du premier élément de ma matrice, cela s'appliquerait à toute les autres.  
Il faut donc fixer les limites dès le début,  même si on ne sait pas quelle sera la quantité de particules (2d col) contenu dans une mollécule(1ere col) ?
 


 

spinzero a écrit :


Ben je voudrais juste associer à chaque assiette (1er col), une quantité variable de spaghettis (2d col)  :whistle:


Donc pas une matrice, ni un tableau (au sens taille fixe).

n°1872522
Lightness1​024
Posté le 13-04-2009 à 19:53:17  profilanswer
 

effectivement, le besoin suggère plutot un vector de list non ?
ou un array de list si la "1ere colonne" ne change jamais de taille.
apres, en fonction des besoins des accès aux listes (en terme de perfs par rapport aux operations qui seront faites le plus souvent), il faut choisir le bon conteneur.
par exemple, si tu ne sais pas la taille finale, tu ne feras que push_back dessus puis finir par parcourir le tout et désallouer tout a la fin.
boost::fast_pool sera un parfait allocateur pour les list.


---------------
http://projets.6mablog.com/
n°1872764
spinzero
Posté le 14-04-2009 à 12:42:33  profilanswer
 

Lightness1024 a écrit :

... plutot un vector de list non ou un array de list si la "1ere colonne" ne change jamais de taille.


Par list  veux-tu dire ptr_list de boost ?
 
En tout cas le principe du vector de liste semble le plus approprié.  
Pour avoir une idée, quelle serait la différence en terme de performance entre une matrice et un vector ou array de list ?
 
Car si c'est considérable, quitte à avoir de nombreuses cases vides,  peut être faudrait-il conserver la première solution  ?
 
Enfin, je ne me rends pas encore compte de ce que je pourrais gagner comme perf mais ces calculs ayant lieu en même temps que d'autres,  des collisions 3d géré par un moteur de physique par ex, il faudrait que je sois le plus léger possible  :sweat:  
 

Lightness1024 a écrit :

... si tu ne sais pas la taille finale,...boost::fast_pool sera un parfait allocateur pour les list.


Je ne l'ai pas encore testé mais en faisant quelques recherches je suis tombé sur cette remarque (http://www.nabble.com/-boost::pool [...] 29499.html) :
 
1. memory blocks allocated by boost::fast_pool tended to never get freed again until the end of the program, because the release mechanism was (is?) disabled
... In fact, when I tested it, fast_pool eventually ran out of memory at about the same time the the local member variable storing the memory increment size sufferd an overflow!

 
J'ai peut être pas compris, mais on dirait qu'on ne peut pas libérer de la mémoire avec cette méthode !?


Message édité par spinzero le 14-04-2009 à 16:25:07
n°1872869
spinzero
Posté le 14-04-2009 à 16:31:29  profilanswer
 

Taz a écrit :


...pas une matrice, ni un tableau (au sens taille fixe).


Tu t'y prendrais comment alors ?

n°1873003
Lightness1​024
Posté le 14-04-2009 à 21:37:56  profilanswer
 

oula, en effet si il y a des leaks.... je ne sais pas je n'ai jamais testé cet allocateur.
j'utilise un conteneur freelist qui me convient
-> http://lightness1024.free.fr/xtrem [...] eelist.hpp
 
si tu veux utiliser des indices tres disparates pour ne jamais rien mettre dans les zones libres, il s'agit d'un contenu "sparse".
peut etre que ce que tu veux c'est ca ?
 

Code :
  1. boost::unordered_map< std::size_t, tools::freelist< double > > mySparseMatrix;
  2. for (std::size_t c = 0; c < 20; ++c)
  3.   for (std::size_t l = 0; l < variable_limit(....); ++l)
  4.     mySparseMatrix[compute_large_value(....)].push_back(compute_some_double(....));


 
ceci créerait une "matrice" de 20 colonnes mais indexée par des valeurs potentiellement tres étalées sans gigantesque perte de mémoire (comme ce serait le cas avec un vector)
chacune des colonne contiendrait un nombre variable de valeur 'double', avec une operation 'push' rapide.
il serait rapide d'acceder en random a une colonne specifique, mais tu ne pourrais que itérer sur les lignes.

Message cité 1 fois
Message édité par Lightness1024 le 14-04-2009 à 21:39:18

---------------
http://projets.6mablog.com/
mood
Publicité
Posté le 14-04-2009 à 21:37:56  profilanswer
 

n°1873005
Joel F
Real men use unique_ptr
Posté le 14-04-2009 à 21:49:33  profilanswer
 

y a pas de leak, juste que la politique de dealloc est de desaoulée en fin de programme ce qui peut mener à arriver à la fin de la zone allouable dans un programme.


Message édité par Joel F le 14-04-2009 à 21:49:40
n°1873144
spinzero
Posté le 15-04-2009 à 10:50:47  profilanswer
 

Lightness1024 a écrit :

oula, en effet si il y a des leaks.... je ne sais pas je n'ai jamais testé cet allocateur.


Comme le dit JoelF c'est un choix volontaire... j'aimerais bien comprendre l'intérêt  :heink:  
Peut-on encore parler le tailles dynamiques si l'on ne peut libèrer de la mémoire durant l'execution d'un programme !?
 

Lightness1024 a écrit :


... freelist ... indices tres disparates ..."sparse".

Code :
  1. boost::unordered_map< std::size_t, tools::freelist< double > > mySparseMatrix;
  2. for (std::size_t c = 0; c < 20; ++c)
  3.   for (std::size_t l = 0; l < variable_limit(....); ++l)
  4.     mySparseMatrix[compute_large_value(....)].push_back(compute_some_double(....));



 
Yep, je ne demande qu'à essayer ... ;)  
 

Lightness1024 a écrit :


...  des valeurs potentiellement tres étalées sans gigantesque perte de mémoire (comme ce serait le cas avec un vector)]


Que veux-tu dire par gigantesque , c'est mesurable ?
 

Lightness1024 a écrit :

chacune des colonne contiendrait un nombre variable de valeur 'double', avec une operation 'push' rapide.


Doit-on préciser quand une colonne est de taille fixe et l'autre non, ou ça ne change rien ?
 L'idéal étant pour moi une 1ere colonne fixe et l'autre non...
 

Lightness1024 a écrit :

il serait rapide d'acceder en random a une colonne specifique, mais tu ne pourrais que itérer sur les lignes.


Là j'suis nouille sur le vocab mais 'les lignes', c'est à l'intérieur d'une colonne ou de la matrice ?
 
  :jap:  
 

n°1873155
Joel F
Real men use unique_ptr
Posté le 15-04-2009 à 10:58:45  profilanswer
 

spinzero a écrit :


Comme le dit JoelF c'est un choix volontaire... j'aimerais bien comprendre l'intérêt  :heink:  
Peut-on encore parler le tailles dynamiques si l'on ne peut libèrer de la mémoire durant l'execution d'un programme !?


 
TU libère jamais pendant. Si t'as besoin de reallouer tu alloue un novueau bloc et laisse tomber l'ancien.
A la terminaison du programme, tout les blocs alloués (actifs ou inactifs sont libéré).
 
En gros, t'as une grosse alloc au debut du chargement du proigramme, allouer pendant coute rien, desallouer coute rien et t'as une seul grosse desalloc en fin de programme.
 
Donc la justification est assez simple à trouver ;)

n°1873264
spinzero
Posté le 15-04-2009 à 12:51:26  profilanswer
 

Joel F a écrit :


 
TU libère jamais pendant. Si t'as besoin de reallouer tu alloue un nouveau bloc et laisse tomber l'ancien


Lorsque tu parles de 'reallouer un novueau bloc' c'est en pensant recommencer quelque chose à partir de zéro, c-à-d supprimer forcément les données antérieures où l'on peut imaginer un transfert vers une matrice plus grande ?
J' avais pensé redéclarer une matrice plus grande à mesure que l'on ajoute des éléments  et la remplir ...mais ça paraissait absurde, étant donné que durant le transfert, 2 matrices était memoire soit 2*+ de données !?
Enfin, est-ce qu'on peut bidouiller de cette manière tout en restant performant où c'est n'importe quoi ?
 

Joel F a écrit :

Donc la justification est assez simple à trouver ;)


Oui c'est clair, enfin je l'imagine comme une étape préliminaire importante au lancement d'une apli,  par ex un jeux video avec le chargement des media, textures, maillages, sons...tout un monde à mettre en place  :D   mais pour un groupe d'objets particuliers, créer à la volé ça colle moins  ;)


Message édité par spinzero le 15-04-2009 à 13:21:47
n°1873294
Lightness1​024
Posté le 15-04-2009 à 13:51:34  profilanswer
 

soyons clair sur ce que tu as envie de faire.
c'est bien un truc comme ca ou pas ?
http://lightness1024.free.fr/conteneur_sparse.jpg


---------------
http://projets.6mablog.com/
n°1873320
spinzero
Posté le 15-04-2009 à 14:09:22  profilanswer
 

Exactly !
... j'insistais juste pour savoir à quel point un tableau fixe serait plus performant mais dans l'idée ton schéma serait le mieux.
 
ps:merci pour le schèm, je vois où sont les lignes  :)


Message édité par spinzero le 15-04-2009 à 14:11:45
n°1873344
spinzero
Posté le 15-04-2009 à 14:28:51  profilanswer
 

Avec Freelist je commence par :
 

Code :
  1. #include <boost/unordered_map.hpp>
  2. #include <tools/freelist.hpp>
  3. #include <cassert>
  4. static boost::unordered_map< std::size_t, tools::freelist< int > > molles_A;
  5. ...
  6. void ajoute( int mol_i, int mode, int idA, int idB )
  7. {
  8. ...
  9. molles_A[0] = mol_i;
  10. //pAdd = molles_A[0][0].push_back(idA);//ne renvoit pas de bool !
  11. molles_A[0][0].push_back(idA);
  12. }


 
Mais erreur C2676 à la ligne 14  :sweat:  
binary '[':'tools::freelist<T> does not define this operator or a conversion to a type acceptable to te predefined operator
 
Ca aussi ça ne marche pas:
 

Code :
  1. molles_A[0] = mol_i;
  2. tools::freelist< int >id_L;
  3. id_L.push_back(idA);
  4. molles_A[0][0].push_back(id_L);


 
ps: j'entends dire qu' std::size_t est un type avec lequel on mesure un array...mais ici comme on ne peut pas le redéfinir, est-ce qu'il sert de valeur indéfinie lors de la déclaration de notre tableau ?


Message édité par spinzero le 15-04-2009 à 17:02:33
n°1873770
spinzero
Posté le 16-04-2009 à 13:20:30  profilanswer
 

Comme j'ai encore du mal avec la syntaxe de boost...je suis reparti du multi_array avant d'attaquer freelist :
 

Code :
  1. typedef boost::multi_array<int, 2> array_type;
  2. typedef array_type::index index;
  3. int cl1 = 10;
  4. int cl2 = 50;
  5. array_type molles_A(boost::extents[cl1][cl2]);
  6. ...
  7. void ajouter(int idMol, int idA, int idB)
  8. {
  9. int nextPos = ..? comment évaluer la position suivant le dernier élément ajouté ?
  10. molles_A[idMol][nextPos] = idA;
  11. molles_A[idMol][nextPos] = idB;
  12. }
  13. void supprimer(id)
  14. {
  15. for(index i = 0; i != cl1; ++i)
  16.     for(index j = 0; j != cl2; ++j)
  17.        if( molles_A[i][j]  == id )
  18. molles_A[i][j] = NULL;
  19.  break;
  20. }


 
 
J'épluche encore la doc de Boost mais pourriez vous m'aider à trouver la formulation pour nextPos ?
 
Et que pensez vous de la manière de supprimer() un élément ?
 
merci


Message édité par spinzero le 16-04-2009 à 16:44:42
n°1874115
Lightness1​024
Posté le 16-04-2009 à 22:57:00  profilanswer
 

pour quel conteneur push_back renvoit-il un bool ?
http://www.cppreference.com/wiki/stl/list/push_back
une liste ne peut pas s'acceder avec l'operateur [] c'est normal si molles[x][y] ne compile pas.
 
voici une solution avec contenu mémoire optimisé exactement par rapport au contenu et accès "efficace":
 

Code :
  1. /**********************************************************************
  2. * File  : sparse_2D_content.cpp
  3. * Date  : 16/04/2009
  4. *********************************************************************/
  5. #include <boost/unordered_map.hpp>
  6. #include <iostream>
  7. struct Position
  8. {
  9. friend size_t hash_value(Position const & p)
  10. {
  11.  size_t seed = 0;
  12.  boost::hash_combine(seed, p.x);
  13.  boost::hash_combine(seed, p.y);
  14.  return seed;
  15. }
  16. size_t x;
  17. size_t y;
  18. Position(size_t x, size_t y) : x(x), y(y)
  19. {}
  20. };
  21. bool operator == (Position const & l, Position const & r)
  22. {
  23. return l.x == r.x && l.y == r.y;
  24. }
  25. int generate_ints;
  26. struct Molle
  27. {
  28. int some_data;
  29. Molle() : some_data(++generate_ints)
  30. {}
  31. };
  32. std::ostream& operator << (std::ostream& os, Molle const & m)
  33. {
  34. os << m.some_data;
  35. return os;
  36. }
  37. int main()
  38. {
  39. const size_t y_max = 3;
  40. boost::unordered_map< Position, Molle > sparse2Dcontent;
  41. typedef boost::unordered_map< Position, Molle >::iterator It;
  42. // ==== usage ====
  43. size_t limit[y_max] = {4,
  44.         2,
  45.         3};
  46. for (size_t y = 0; y < y_max; ++y)
  47. {
  48.  for (size_t x = 0; x < limit[y]; ++x)
  49.  {
  50.   sparse2Dcontent[Position(x, y)] = Molle();
  51.  }
  52. }
  53. size_t x = 0, y = 0;
  54. while (y < y_max)
  55. {
  56.  It it = sparse2Dcontent.find(Position(x, y));
  57.  if (it == sparse2Dcontent.end())
  58.  {
  59.   ++y;
  60.   x = 0;
  61.   std::cout << std::endl;
  62.  }
  63.  else
  64.  {
  65.   std::cout << "element en y:" << y << " x:" << x << " = " << it->second.some_data << std::endl;
  66.   ++x;
  67.  }
  68. }
  69. return 0;
  70. }


 
 
affichage:
 

element en y:0 x:0 = 2
element en y:0 x:1 = 4
element en y:0 x:2 = 6
element en y:0 x:3 = 8
 
element en y:1 x:0 = 10
element en y:1 x:1 = 12
 
element en y:2 x:0 = 14
element en y:2 x:1 = 16
element en y:2 x:2 = 18


---------------
http://projets.6mablog.com/
n°1874254
spinzero
Posté le 17-04-2009 à 10:53:28  profilanswer
 

Super Lightness1024  :wahoo:  
 

Lightness1024 a écrit :

pour quel conteneur push_back renvoit-il un bool ?
http://www.cppreference.com/wiki/stl/list/push_back
une liste ne peut pas s'acceder avec l'operateur [] c'est normal si molles[x][y] ne compile pas.


ah, j'avais pas compris ça comme ça  :heink:  
 
...par contre j'ai un peu de mal à saisir ta manière de modifier une Molle  :D  
Jusqu'à présent je pensais la déduire du tableau (1ere col pour son ID, 2d col particle IDs),  
et là c'est carrément une Structure !
Bon, ok pour le principe mais ces 2 lignes m'intrigue :

Code :
  1. Molle() : some_data(++generate_ints)


...

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


Je ne vois pas où tu modifies le contenu d'une Molle ?
On dirait que ça se passe dans la sructure avec ++generate_ints produisant une valeure aléatoire ?
Comme je ne suis pas habitué à la syntaxe, j'ai l'impression que Molle() est appelé comme une fonction ?
 
Enfin, le test fonctionne, reste à formuler l'ajout/suppression des ID de mes particules ds la 2d col ...
 
merci bcp pour ton exemple  :jap:  
 
ps: j'ai entendu dire que les arrays 2D d'STLSoft seraient plus rapide .?!


Message édité par spinzero le 17-04-2009 à 10:58:28
n°1874267
Joel F
Real men use unique_ptr
Posté le 17-04-2009 à 11:21:06  profilanswer
 

Code :
  1. Molle() : some_data(++generate_ints)


constructeur par défaut qui appelle ++ sur generate_int qui incremente l'entier.
 

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


 
creation d'un objet Molle temporaire apr appel du constructeur par defaut et copie dasn le tableau
 

n°1874273
Taz
bisounours-codeur
Posté le 17-04-2009 à 11:27:37  profilanswer
 

Joel F a écrit :

Code :
  1. Molle() : some_data(++generate_ints)


constructeur par défaut qui appelle ++ sur generate_int qui incremente l'entier.
 

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


 
creation d'un objet Molle temporaire apr appel du constructeur par defaut et copie dasn le tableau
 


Ca vaut quoi les sparse machin implémenté sur des hash ? Faut vraiment que ça soit ultra sparse, parce que niveau localité, c'est 0 ?

n°1874275
Joel F
Real men use unique_ptr
Posté le 17-04-2009 à 11:31:00  profilanswer
 

moi j'aime aps, les technqiues à base d'horizon m'ont trjrs paru  meilleurs.
Ca ou utilisé des algos  cache oblivious

n°1874288
spinzero
Posté le 17-04-2009 à 11:41:44  profilanswer
 

Joel F a écrit :

Code :
  1. Molle() : some_data(++generate_ints)


constructeur par défaut qui appelle ++ sur generate_int qui incremente l'entier.


Evidament, c'est pourtant ce que j'ai vu...mais  mal interprété les valeurs de x  :whistle:  

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


Joel F a écrit :


creation d'un objet Molle temporaire apr appel du constructeur par defaut et copie dasn le tableau


 
Ok, donc je peux faire passer les id de mes particules comme ça :
 

Code :
  1. void updateMolles_A(  int id_mol, int idA, int idB)
  2. {
  3. generate_ints = idA;
  4. sparse2Dcontent[Position(id_mol, 0)] = Molle();
  5. generate_ints = idB;
  6. sparse2Dcontent[Position(id_mol, 1)] = Molle();
  7. }


Message édité par spinzero le 17-04-2009 à 12:14:03
n°1874291
spinzero
Posté le 17-04-2009 à 11:46:10  profilanswer
 

Joel F a écrit :

... technqiues à base d'horizon ...ou des algos  cache oblivious


Ah, pourrais-tu être plus explicite ?
 
ps: ça rabaisse sans doute le niveau du sujet discuté  ;) ...mais il paraît qu'en terme de perf, le plus radical reste le bon vieux tableau natif [n][n];  sachant qu'on ne pourra pas gérer d'exceptions mais si en sachant cadrer correctement...


Message édité par spinzero le 17-04-2009 à 11:47:50
n°1874400
Joel F
Real men use unique_ptr
Posté le 17-04-2009 à 15:18:37  profilanswer
 

le coup du tableau natif c'ets un bon vieux FUD.
Quant au reste : google :o

n°1874607
spinzero
Posté le 18-04-2009 à 09:05:35  profilanswer
 

Joel F a écrit :

...tableau natif c'ets un bon vieux FUD.


 :lol:  bon
 
As tu déjà utilisé StlSoft ?
 
Sinon, une dernière interrogation sur les tableaux:
Un tableau fixe, déclaré ou non au début d'un programme, n'est-il pas aussi plus rapide à parcourir, du fait que ses cases mémoires sont plus compactes que celles d'un tableau dynamique qui, en fonction de la mémoire disponible à un instant T, mobilisera des cases plus disparates ?

n°1874650
Taz
bisounours-codeur
Posté le 18-04-2009 à 13:00:49  profilanswer
 

spinzero a écrit :


 :lol:  bon

 

As tu déjà utilisé StlSoft ?

 

Sinon, une dernière interrogation sur les tableaux:
Un tableau fixe, déclaré ou non au début d'un programme, n'est-il pas aussi plus rapide à parcourir, du fait que ses cases mémoires sont plus compactes que celles d'un tableau dynamique qui, en fonction de la mémoire disponible à un instant T, mobilisera des cases plus disparates ?

Ca dépend si t'alloues ton tableau à N dimension comme un étudiant de L1 ou si tu mérites ton salaire (hum enfin mériter pour 3 lignes de codes...)

Message cité 1 fois
Message édité par Taz le 18-04-2009 à 13:01:22
n°1874744
Joel F
Real men use unique_ptr
Posté le 18-04-2009 à 19:35:17  profilanswer
 

un tableau à N dimensions dense bien alloué est compacte et cache friendly. Sinon c'ets que tu sais pas programmer :o
 
J'ai donner 10 fois le code pr le faire proprement

n°1874745
Joel F
Real men use unique_ptr
Posté le 18-04-2009 à 19:36:46  profilanswer
 


 
Ben non, je vois tout les jorus de ingés et des psot-docs me crier que tab[][] ets plsu rapide que tout alors que meme vector<T> ou multi_array<T,N> votn strictement à la meme vitesse sur des cas normaux. Ce qui comtpe c'est le cache friendliness de l'algo pas comment ton tableau est géré (sauf remarque precedente sur l'alloc)

n°1874811
spinzero
Posté le 19-04-2009 à 01:12:08  profilanswer
 

Taz a écrit :

Ca dépend si t'alloues ton tableau à N dimension comme un étudiant


C'est vrai que dans mon cas, je n'ai même pas le niveau d'un mauvais étudiant  ;)  
Si j'avais compris plus tôt la puissance de la prog, j'ai pourtant eu un amiga avec des démo pirates...j'aurais changé de branche directe!.. mais bon, ch'suis plus étudiant et pouvoir apprendre grâce aux forums, c'est vraiment génial!
Merci les gars  :jap:  
 

Taz a écrit :

si tu mérites ton salaire (hum enfin mériter pour 3 lignes de codes...)


Oh oui, s'il arrive au bout de son projet, je peux te dire qu'il sera le plus heureux des hommes  :pt1cable:


Message édité par spinzero le 19-04-2009 à 01:55:23
n°1874812
spinzero
Posté le 19-04-2009 à 01:24:22  profilanswer
 

Joel F a écrit :


... je vois tout les jorus de ingés et des psot-docs me crier ...
)


Oui, moi je prépètes ce que je lis car je commence mais toi qui exerce, en faisant tes propres tests, tu dois avoir un avis perso ?
Ce que tu m'as dis jusqu'à présent, c'était théorique ou aussi lié à ta praxis ?
 

Joel F a écrit :


 Ce qui comtpe c'est le cache friendliness de l'algo pas comment ton tableau est géré (sauf remarque precedente sur l'alloc)


Je découvre l'expression (http://blog.cplusplus-soup.com/200 [...] rency.html)  mais j'ai déjà rencontré un problème de processus concurrents, une boucle graphique OpenGl contre une boucle son avec buffer;  et c'est là que j'ai découvre les threads  :ange: ...

n°1874820
Joel F
Real men use unique_ptr
Posté le 19-04-2009 à 09:09:54  profilanswer
 

spinzero a écrit :


Oui, moi je prépètes ce que je lis car je commence mais toi qui exerce, en faisant tes propres tests, tu dois avoir un avis perso ?
Ce que tu m'as dis jusqu'à présent, c'était théorique ou aussi lié à ta praxis ?


 
C'est d ela pratique, ca fait 5 ans que mon boulot c'est faire des outils de calcul haute-performances alors ce genre de blague , je les ai testé de A à Z. Moralité, l'interface entre la mémorie brute et l'utilsiateur n'a pas d'impact. La seule chose qui impact c'est la manière dont les elements sont allouées et comment on aprcourt. Engros :
 
tableau natif [][] est equivalnt à tableau dynamique dans une classe avec operator() et ces deux méthodes sont 3 à 12 fois plus rapide que des iterator.

n°1874949
spinzero
Posté le 19-04-2009 à 19:17:29  profilanswer
 

Joel F a écrit :


 ca fait 5 ans que mon boulot c'est faire des outils de calcul haute-performances


Ok, respect  :jap:  
 

Joel F a écrit :


tableau natif [][] est equivalnt à tableau dynamique dans une classe avec operator() et ces deux méthodes sont 3 à 12 fois plus rapide que des iterator.


 
Je le note en rouge !
...hum, encore un petit éclaircissement,  
dans  ce que tu m'as proposé plus haut, on utilise à la fois operator et iterator !?


Message édité par spinzero le 19-04-2009 à 19:17:45
n°1874950
Joel F
Real men use unique_ptr
Posté le 19-04-2009 à 19:21:33  profilanswer
 

Bah ça depends de ce que tu as besoin aussi et si ton container à une semantique de conteneur dense contigu ce qui n'est pas le cas d'une hash table.

n°1875028
spinzero
Posté le 20-04-2009 à 09:12:49  profilanswer
 

Joel F a écrit :

Bah ça depends de ce que tu as besoin aussi et si ton container à une semantique de conteneur dense contigu ce qui n'est pas le cas d'une hash table.


D'accord, donc dans ce cas l'iterator est bien indispensable .
 
Sinon, comment supprimer un élément, trouver son range et redimentionner ?


Message édité par spinzero le 20-04-2009 à 09:23:07
n°1875035
Joel F
Real men use unique_ptr
Posté le 20-04-2009 à 09:26:21  profilanswer
 

lire la doc de unordered_map :o ?

n°1875227
spinzero
Posté le 20-04-2009 à 13:11:07  profilanswer
 

Joel F a écrit :

lire la doc de unordered_map :o ?


Ben oui qd même, mais si c'est bien dans ce menu :
 
Table of Contents
 
Introduction  
The Data Structure  
Equality Predicates and Hash Functions  
Comparison with Associative Containers  
Implementation Rationale  
Change Log  
Reference  
Header <boost/unordered_set.hpp>  
Header <boost/unordered_map.hpp>  
Bibliography  
 
c que j'ai loupé un passage :sleep:


Message édité par spinzero le 20-04-2009 à 13:20:55
n°1875906
spinzero
Posté le 21-04-2009 à 16:16:41  profilanswer
 

Salut  :whistle:  
 
Tu n'aurais pas une piste, je sèche  :sweat:  
 
 j'ai beau lire la doc ... on parle de re_hash, unordered_multiset, de Buckets ...  
moi pas bien comprendre articulation tt ces concepts  :??:  
Je pense avoir au - compris qu'on ne pouvait pas effacer directement un élement mais qu'il fallait passer par un redimensionnement et/ou rehashage ??
 
Dans Implementation rationale j'entends parler  
Are insert and erase stable for unordered_multiset and unordered_multimap?  
It is not specified if unordered_multiset and unordered_multimap preserve the order of elements with equivalent keys (i.e. if they're stable under insert and erase). This is issue 581. The current proposal is that insert, erase and rehash are stable - so they are here.

 
...mais pas d'exemples.
 
Là seul bêtise que j'ai commencé à faire c'est:
 

Code :
  1. void cleanMollePOS( size_t x, size_t y ){
  2.    for( boost::unordered_map< Position, Molle >::iterator It= sparse2D.begin(); sparse2D.end()!= It ; It++)
  3.    {
  4.     delete(It)->second;
  5.    }
  6. }


 


Message édité par spinzero le 21-04-2009 à 16:22:07
n°1875949
Taz
bisounours-codeur
Posté le 21-04-2009 à 17:39:46  profilanswer
 

Bah si Molle est un typdef de Machin*, aucun problème ?

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Tableau dynamique BOOST

 

Sujets relatifs
Creation de tableau[C] Initialisation d'un tableau constant
Problème avec allocation dynamique de tableau (C)tri de plusieurs tableau
Créer un tableau de correspondanceExplication d un tableau sérialisé
recopie texte d'un champ dans un tableauRécupérer un graphique dynamique
Plus de sujets relatifs à : Tableau dynamique BOOST


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR