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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°703377
FroggyDew
Posté le 20-04-2004 à 03:06:28  profilanswer
 

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.

mood
Publicité
Posté le 20-04-2004 à 03:06:28  profilanswer
 

n°703378
Taz
bisounours-codeur
Posté le 20-04-2004 à 03:08:33  profilanswer
 

(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
n°705517
FroggyDew
Posté le 21-04-2004 à 23:34:21  profilanswer
 

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.?

n°705519
skelter
Posté le 21-04-2004 à 23:36:11  profilanswer
 

ben tu manipul ton vector comme un tableau

n°705523
Taz
bisounours-codeur
Posté le 21-04-2004 à 23:42:08  profilanswer
 

ou avec stl

n°706983
FroggyDew
Posté le 23-04-2004 à 12:35:32  profilanswer
 

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?

n°706997
Taz
bisounours-codeur
Posté le 23-04-2004 à 12:53:20  profilanswer
 

quels critères ?

n°707556
FroggyDew
Posté le 23-04-2004 à 22:45:19  profilanswer
 

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

n°707560
Taz
bisounours-codeur
Posté le 23-04-2004 à 23:15:43  profilanswer
 

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.

n°707607
FroggyDew
Posté le 24-04-2004 à 07:34:18  profilanswer
 

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!

mood
Publicité
Posté le 24-04-2004 à 07:34:18  profilanswer
 

n°707626
Taz
bisounours-codeur
Posté le 24-04-2004 à 11:15:02  profilanswer
 

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

n°708469
FroggyDew
Posté le 26-04-2004 à 12:16:28  profilanswer
 

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!..."

n°708578
Taz
bisounours-codeur
Posté le 26-04-2004 à 14:00:26  profilanswer
 

sauf que inline et enum font parti du C

n°709188
FroggyDew
Posté le 26-04-2004 à 22:55:49  profilanswer
 

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!

n°709259
Taz
bisounours-codeur
Posté le 27-04-2004 à 01:19:10  profilanswer
 

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

n°709276
FroggyDew
Posté le 27-04-2004 à 03:36:37  profilanswer
 

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...

n°709277
Taz
bisounours-codeur
Posté le 27-04-2004 à 04:27:44  profilanswer
 

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

n°711393
FroggyDew
Posté le 28-04-2004 à 23:02:19  profilanswer
 

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?

n°711396
Taz
bisounours-codeur
Posté le 28-04-2004 à 23:06:56  profilanswer
 

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

n°711402
FroggyDew
Posté le 28-04-2004 à 23:14:46  profilanswer
 

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...

n°711405
Taz
bisounours-codeur
Posté le 28-04-2004 à 23:35:31  profilanswer
 

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

n°711422
FroggyDew
Posté le 29-04-2004 à 00:16:14  profilanswer
 

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

n°711438
Taz
bisounours-codeur
Posté le 29-04-2004 à 00:27:32  profilanswer
 

de la merde

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
[PHP]Rechercher dans un tableauTypes d'erreurs lors d'un accès à un fichier avec Glib
[Access] transfert de donnéesCrypter un champ dans une base de données sql server
[SQL] Il ne trie pas mon tableau par ordre alphaUne variable dans un chemin d'accès aux objets d'un formulaire
[php] Il me repete mon tableau 2x pourquoi ???.txt --> VB --> BD acces (une bd acces a partir d'un .txt)
Etendre la référence d'une plage de donnéesComment Importer des données Sql en Vb
Plus de sujets relatifs à : [Builder6] tableau pour un accès rapide et régulier de données?


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