[Builder6] tableau pour un accès rapide et régulier de données?

tableau pour un accès rapide et régulier de données? [Builder6] - C++ - Programmation

Marsh Posté le 20-04-2004 à 03:06:28    

Bonjour à tous,
 
Je développe une application de simulation de dynamique de populations d'oiseaux qui habitent des fragments de forêts. Pour stocker mes individus avec leurs caracteristiques (coordonnées x, y; habitat; age; sexe...), j'utilise une liste de structure (NomStructure NomVar [10000]) dont je fais souvent appel dans mon programme (ils meurent, bougent, se reproduisent...), j'appelle chaque individu par leur numero de ligne. Est-ce une bonne idée? Y a t-il de meilleures façons (pas trop compliquées) plus efficaces pour un accès régulier et rapide? Si oui, comment dois-je m'y prendre?
J'utilise une TListView pour afficher le contenu de ma structure, mais quand toutes mes lignes sont pleines, mon programme peine beaucoup... J'aimerais améliorer cela.
 
Merci d'avance.

Reply

Marsh Posté le 20-04-2004 à 03:06:28   

Reply

Marsh Posté le 20-04-2004 à 03:08:33    

(NomStructure NomVar [10000])
 
déjà une taille statique en pile, c'est nulle. std::vector sera bien mieux
 
sinon, non aucun accès plus rapide que l'accès direct a[i]


Message édité par Taz le 20-04-2004 à 03:08:46
Reply

Marsh Posté le 21-04-2004 à 23:34:21    

Merci pour la réponse.
OK, je viens de me renseigner un peu, j'arrive à faire un vecteur ou une liste à partir de ma structure. C'est vrai que l'allocation dynamique est bien mieux.  
Mais comment puis-je chercher maintenant un de mes individus a partir de ses caracteristiques, ce que je faisais avant en parcourant la structure[10000] et m'arretant quand individu[x].Age==2 par ex.?

Reply

Marsh Posté le 21-04-2004 à 23:36:11    

ben tu manipul ton vector comme un tableau

Reply

Marsh Posté le 21-04-2004 à 23:42:08    

ou avec stl

Reply

Marsh Posté le 23-04-2004 à 12:35:32    

Ok, merci pour ça. Je commence à maitriser un peu ces containers, j'ai essayé les maps, lists, vectors en stl. Maintenant le problème est: lequel choisir???
 
pour info, je n'ai pas vraiment besoin d'ordonner mes entrées, mais je parcours régulièrement la liste complète et j'ai souvent besoin d'accès direct à certaines entrées correspondant à certains critères.
D'après ce que j'ai lu, les maps ont l'air plus adéquats, vous confirmez?

Reply

Marsh Posté le 23-04-2004 à 12:53:20    

quels critères ?

Reply

Marsh Posté le 23-04-2004 à 22:45:19    

correspondant à des valeurs precises des variables de la structure.  
ex: if (individu.age="adulte" && individu.sex="F" ) GoFindAMaleAndBreed();

Reply

Marsh Posté le 23-04-2004 à 23:15:43    

Code :
  1. /*
  2. * Ça c'est ta classe Individu
  3. */
  4. #include <string>
  5. class Individu
  6. {
  7. public:
  8.   // Types publics
  9.   enum Sexe
  10.     {
  11.       Masculin = 1,
  12.       Feminin  = 2
  13.     };
  14.   enum Age
  15.     {
  16.       Enfant,
  17.       Adulte,
  18.       Vieillard
  19.     };
  20. public:
  21.   // membres publics
  22.   Sexe sexe;
  23.   Age age;
  24.   std::string nom;
  25. public:
  26.   // Fonctions membres publiques
  27.   Individu(const std::string &n, Sexe s, Age a)
  28.     : sexe(s), age(a), nom(n)
  29.   {
  30.     // NOOP
  31.   }
  32. };
  33. /*
  34. * Quelques algorithmes
  35. */
  36. /*
  37. * Applique f aux éléments e de [first, last[ si p(e)
  38. */
  39. template<typename InputIterator,
  40.  typename Predicate,
  41.  typename Appliable>
  42. void
  43. apply_if(InputIterator first, InputIterator last,
  44.  const Predicate p, const Appliable f)
  45. {
  46.   while(first != last)
  47.     {
  48.       if(p(*first))
  49. {
  50.   f(*first);
  51. }
  52.       ++first;
  53.     }
  54. }
  55. /*
  56. * Objet-fonction a qui on délègue la recherche
  57. */
  58. struct MatchAgeAndSexe
  59. {
  60.   const Individu::Sexe sexe;
  61.   const Individu::Age  age;
  62. public:
  63.   MatchAgeAndSexe(Individu::Sexe s, Individu::Age a)
  64.     : sexe(s), age(a)
  65.   {
  66.     // NOOP
  67.   }
  68.   bool operator()(const Individu &i) const
  69.   {
  70.     return (i.sexe == this->sexe) && (i.age == this->age);
  71.   }
  72. };
  73. /*
  74. * Utilisation
  75. */
  76. #include <iostream>
  77. #include <vector>
  78. inline void
  79. AfficheEtatCivil(const Individu &i)
  80. {
  81.   std::cout << "\"" << i.nom << "\"\n";
  82. }
  83. inline void
  84. Fetch(const std::vector<Individu> &vi, Individu::Sexe s, Individu::Age a)
  85. {
  86.   apply_if(vi.begin(), vi.end(), MatchAgeAndSexe(s, a), AfficheEtatCivil);
  87. }
  88. /*
  89. * main de test
  90. */
  91. int main()
  92. {
  93.   std::vector<Individu> gang;
  94.   gang.push_back( Individu("TazForEver", Individu::Masculin, Individu::Adulte) );
  95.   gang.push_back( Individu("Bjarne",     Individu::Masculin, Individu::Vieillard) );
  96.   gang.push_back( Individu("Samantha",   Individu::Feminin,  Individu::Adulte) );
  97.   gang.push_back( Individu("Harkonnen",  Individu::Masculin, Individu::Adulte) );
  98.   gang.push_back( Individu("antp",       Individu::Masculin, Individu::Adulte) );
  99.   gang.push_back( Individu("lorill",     Individu::Masculin, Individu::Adulte) );
  100.   Fetch(gang, Individu::Masculin, Individu::Adulte);
  101. }


 
allez grosse tartine, c'est dur à croire mais je l'ai même pas compilé. à part des erreurs de typos, je ne vois pas de problèmes à priori. Bien sur on peu améliorer les classes en mettant des membres const en en définissant bien la totalité de la forme de coplien.

Reply

Marsh Posté le 24-04-2004 à 07:34:18    

WOW! impressionant! mais il va me falloir un p'tit moment pour digérer ça... On dirait presque un autre language pour moi! je ne suis pas certain que Builder6 va avaler tout ça comme ça, mais je vais essayer.
Merci encore vieille saucisse!

Reply

Marsh Posté le 24-04-2004 à 07:34:18   

Reply

Marsh Posté le 24-04-2004 à 11:15:02    

ben c'est du C++ et pas le C avec cout+class que tu faisais jusqu'à présent.

Reply

Marsh Posté le 26-04-2004 à 12:16:28    

je parlais plutot de inline, enum, fetch... que je n'ai jamais encore utilisés. Et je n'utilise jamais de cout avec Builder comme il n'y a pas de fenêtre output.
Je ne suis pas encore arrivé à déchiffrer ton code, mais est-ce qu'il est facilement généralisable à plus de 2 variables (autres que age et sexe) car j'en ai un certain nombre?
 
J'ai essayé d'utiliser les lists, mais comment fais-tu pour passer un iterateur à une fonction (ou un qui est déréferencé) ? Pour être plus précis, j'ai une fonction qui cherche l'enregistrement que je veux dans la liste, et j'aimerais qu'elle file l'iterateur à une autre fonction qui fait quelque chose avec l'enregistrement trouvé (c'est clair?). Je ne sais pas comment faire, mes essais ont été infructueux jusqu'à maintenant (tiens tiens, bizarre bizarre...)
 
cout<<"please help me!..."

Reply

Marsh Posté le 26-04-2004 à 14:00:26    

sauf que inline et enum font parti du C

Reply

Marsh Posté le 26-04-2004 à 22:55:49    

c'est pour ca... je suis passé directement par la case C++...
 
et pour ma question sur le passage d'un iterateur à une fonction??? Aidez-moi SVP, je suis vraiment au point mort et ca commence à faire... Ca doit être simple pour des experts comme vous!

Reply

Marsh Posté le 27-04-2004 à 01:19:10    

je vois pas le problème avec le passage d'itérateur à une fonction

Reply

Marsh Posté le 27-04-2004 à 03:36:37    

ouais ben moi non plus a priori... mais le compilateur me traite de programmeur obsolète ou me lance une Declaration Syntax Error.
Tant pis, je vais jouer avec un seul iterateur en global, la fonction Find va le laisser là où la condition est satisfaite et va il être récupéré par l'autre fonction qui fait un truc à son emplacement, sans avoir à l'appeler en argument. Mais ca ne me semble pas être une bonne pratique...

Reply

Marsh Posté le 27-04-2004 à 04:27:44    

si tu montrais ton code et le message d'erreur ...

Reply

Marsh Posté le 28-04-2004 à 23:02:19    

j'ai tout changé maintenant, je ne suis pas vraiment en mesure de répéter ce que j'avais fait, mais en gros la déclaration de mes fonctions qui utilisaient les iterateurs en argument était:
void Function1 (int i, list <individuals, allocator < individuals > > It);
et il n'aimait pas ca.
 
Mais bon, j'utilise maintenant des iterateurs en global que mes fonctions placent et reprennent, et ca marche.
Mais ce n'est pas encore très optimisé, car quand ma liste a 20000 individus et que pour les faire se trouver un partenaire, il faut parcourir toute la liste pour chaque individu (20000*20000 = 400 millions d'iterations!!!) plus faire des calculs de distance... bref, ca rame à mort juste pour un petit truc.
 
des idées pour optimiser cela?
 
Le tri de listes est-il rapide? Car je pensais trier ma liste en fonction de l'habitat (chaque inidividu doit trouver sa partenaire dans le meme endroit), commencer a la premiere ligne qui correspond a l'habitat de l'individu1 incrementer jusqu'a ce que l'iterateur ne rencontre plus l'habitat recherché.
Mais lors de tri de liste, que deviennent mes iterateurs globaux, indiqueront-ils les même enregistrements qu'avant?

Reply

Marsh Posté le 28-04-2004 à 23:06:56    

allocator < individuals >
 
pas la peine de le spécifier
 
passe par &
 
le tri de liste est ultra lent
 
utilise slist/set/queue/vector/priority_queue/map, etc

Reply

Marsh Posté le 28-04-2004 à 23:14:46    

merci pour ta reponse utlra-rapide!
j'ai pas essayé encore avec &, mais sans allocator, ca ne marche pas. j'vais voir.
 
je voulais une map, mais ca ne marchait pas, p'tet qu'il faudrait que je re-essaye avec l'experience acquise ces quelques derniers jours...

Reply

Marsh Posté le 28-04-2004 à 23:35:31    

sans allocators, ça marche :o ou alors t'as vraiment un compilateur de merde :o
 

Reply

Marsh Posté le 29-04-2004 à 00:16:14    

Borland C++ Builder 6... y'a du bon et du mauvais

Reply

Marsh Posté le 29-04-2004 à 00:27:32    

de la merde

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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