Question simple, STL c++, ( indexation d'objet )

Résolu
Wiiip Messages postés 15 Date d'inscription jeudi 26 juin 2003 Statut Membre Dernière intervention 4 avril 2006 - 8 juin 2005 à 16:08
ramziatb Messages postés 1 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 17 mars 2008 - 17 mars 2008 à 12:23
Bonjour, merci,

Je suppose que ce n'est pas bien compliqué, et que l'on doit pouvoir faire cela facilement avec la stl.

Je cherche à faire un index pour un objet.



En fait, c'est tout simple. J'ai un objet (l'objet se reference nom, et
un pointeur sur l'objet), et je veux faire un index de ces objets.



-> Il faut que j'insere mon couple (nom, pointeur) dans un index
trié sur le nom. (je fourni les fonctions, egal() et plus_grand(), de
comparaison entre 2 noms )

-> Il faut que je demande s'il y a un couple portant un nom donné,
et si oui, me renvoyer le pointeur. (et si non, vous vous en doutez, je
vais le creer et l'inserer)

-> Il faut parcourir entierement mon index, (donc faire
for(taille_index) { index[i]...}), avoir la taille de l'index et
acceder individuellement à chaque element. (vi, un iterateur en somme)



Voila, je n'ai juste pas envie de coder cela, alors que le vector ou un autre truc doit me faire cela facilement.



Sinon, je peux aussi faire un vector, parcourir à chaque fois tout le
vector pour chercher le nom, mais si on me fourni une fonction plus
rapide pour chercher le nom, j'achete, j'ai besoin d'optimiser un peu.



un detail, il se trouve que le "nom" de mon objet est un tableau de
nombres, vous n'avez pas à le savoir, je fais mes fonctions de
comparaison entre 2 tableaux, ce tableau peut aussi etre vu comme un
nombre géant (bien plus grand qu'un double) dont chaque chiffre est
l'un des nombres dans une base nombre_max (ca c'est utile pour faire
une fonction de hashage), bref on s'en fiche, c'est juste que si vous
me trouvez un truc genial pour trier des "Durant Jules" et "Hugo
Victor", cela ne m'arrangera pas particulierement.



Un autre detail, c'est plutot tout bete, mais d'un autre coté, je ne
sais pas programmer, ni programmer objet, donc bien dire quel include,
et quelle fonction utiliser, on m'envoyer une url avec le cours, ca
marche aussi :p



Merci, j'ai parlé beaucoup, mais c'est pour etre plus clair ;-)



Wiiip - petit programmeur '^^

4 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 juin 2005 à 16:56
Pour le premier problème, c'est une map qu'il te faut (un arbre binaire quoi): map<string, object*>

La recherche est dichotomique, comme dans un vector trié, mais ca
convient mieux si tu fais beaucoup de suppressions et d'insertions.
3
Wiiip Messages postés 15 Date d'inscription jeudi 26 juin 2003 Statut Membre Dernière intervention 4 avril 2006
8 juin 2005 à 18:19
Merci !

Par contre, comme je ne réussi pas bien à comprendre leurs explications.



L'insertion est faite avec ma_map["Victo Hugo"]=un_objet_qui_vous_veut_du_bien; c'est très simple ^^



L'accès se fait tout simplement par ma_map["John Lennon"]

-> il revoit NULL s'il n'y a pas "John Lennon" dans la map ?



le parcours se fait tout simplement avec

for(iterator my_iterator = ma_map.begin ; my_iterator.j'ai_un_suivant(); my_iterator++){

cout<< my_iterator.first; }

-> questions :

-quel est le vrai nom de la fonction "j'ai_un_suivant()" ? :D

-(facultatif) pourquoi "first", pourquoi ce nom ?

-(facultatif) comment fait il ses tests d'egalité entre les clefs ? Il
regarde la valeur de tous les bits de l'objet clef ? Comment fait il si
l'objet est un char*, ou un int*, ou un objet_inconnu ? S'il compare
l'adresse, cela ne va pas marcher ^^ (or ma_map["Victor Hugo"], ca
marche, enfin, je crois, j'espere.)



Merci !



Wiiip - trallalla 0:-)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 juin 2005 à 18:38
Pour savoir si un objet est dans la map, utilise find.

Les boucles sont de la forme:

for(iterator my_iterator = ma_map.begin() ; my_iterator != ma_map.end(); my_iterator++)

first c'est le premier élément (la clé, ici l'index, c'est celui qui
permet de trier les éléments, c'est donc lui qui doit pouvoir être
comparé, tout ceci est logique)

Avec des char* il va comparer l'adresse en effet, c'est pas forcément
ce que l'on veut, tu devrais donc créer ta classe, et map utilisera
alors operator= pour tester l'égalité (ici tu a autant intérêt à
utiliser string).
0
ramziatb Messages postés 1 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 17 mars 2008
17 mars 2008 à 12:23
bonjour !
je suis débutante est l'indéxationn avec C++ m'intérèse
SVP aidez moi
0
Rejoignez-nous