probleme avec le lower_bound d'un vector de classes [RESOLU] - C++ - Programmation
Marsh Posté le 07-03-2006 à 13:26:36
si tu veux faire du tri par insertion un std::set (ou std::multiset) conviendra mieux je penses
Marsh Posté le 07-03-2006 à 13:44:52
Je vais essayer avec std::set. (ca fait une notion de plus a comprendre )
Mais comme je suis curieux, j'aimerais savoir qu'est ce qui cloche avec lower_bound D'ailleurs, std::set utilise aussi une fonction de comparaison d'après ce que j'ai vu, donc le probleme risque de persister (mais bon, je serais fixé lorsque j'essaierais ).
Marsh Posté le 07-03-2006 à 16:47:24
C'est possible que tu nous copies/colles ton code et le message d'erreur complet ?
Et ton _tab il est de quel type ?
Marsh Posté le 08-03-2006 à 14:04:47
_tab est un vector d'Annonce et la classe Annonce est defini comme ca (et je met la classe Agence au passage aussi ):
Code :
|
Et maintenant, la fonction qui pose probleme:
Code :
|
Et donc l'erreur en question (normalement je compile sous Linux, mais là je n'ai qu'un poste windows mais l'erreur est la même de memoire ) :
C:/Program Files/Dev-Cpp/include/c++/3.3.1/bits/stl_algo.h: In function ` |
Le genre d'erreur que j'aime pas
Merci de votre aide (j'avoue j'ai pas encore essayé avec std::set, j'ai pas trop le temps en ce moment, dsl)
Marsh Posté le 10-03-2006 à 21:14:07
Je pensais que la re-définition de l'operateur < pouvait regler le probleme. Tu penses donc que je ne peux pas m'en sortir avec lower_bound et une classe ? Je debute un peu avec les templates et les conteneurs, donc toute aide est la bienvenue
Marsh Posté le 10-03-2006 à 21:15:22
mais bon sang, comme tu fais pour comparer
3 < petite_annonce ?
Marsh Posté le 10-03-2006 à 21:59:05
Merci beaucoup Même si ta facon de me le faire remarqué n'est pas très douce, j'ai au moins compris mon erreur
J'ai donc redefini mon operateur pour la comparaison avec des int (d'un coté comme de l'autre).
Merci aussi à skelter pour on idée qui me resservira sans doute plus tard
Marsh Posté le 10-03-2006 à 22:15:35
NON ! NON ! NON !
il te faut soit :
Annonce::Annonce(int);
soit :
Annonce::operator int() const
Marsh Posté le 10-03-2006 à 22:33:22
Euh, là j'avou ne pas comprendre La redefinition de l'operateur marche très bien et me semble être une facon "propre" de coder, non ?
Il faudrait que tu explique un peu plus ce que tu as en tete Si je comprend bien la deuxieme solution, tu me demande de definir un operateur de cast alors que ma classe Annonce ne s'y prete pas tout à fait (donc je dois surement être à cent lieues de ce que tu pense)
et pour la premiere solution, je ne la comprend pas l'interet de ce nouveau constructeur
Donc donne moi plus d'explications stp
Marsh Posté le 10-03-2006 à 22:41:12
non c'est dégueux et pas pas orthogonal du tout.
montre ta surcharge bidon d'operator<(Annonce, int) et je te dis quoi faire.
Marsh Posté le 10-03-2006 à 22:46:43
Taz a écrit : il te faut soit : |
avec un acces *private*
Et définir
bool operator<( Annonce const& lhs, Annonce const& rhs)
{
return lhs.loyer < rhs.loyer;
}
Citation : soit : |
Je vois pas l'utilité la ...
Marsh Posté le 10-03-2006 à 22:46:59
Code :
|
Hop là, j'ai rajouté ca dans la definition de ma classe Annonce. Apparemment, même pas besoin d'en definir un exterieur a la classe pour la comparaison de int<Annonce.
edit: grilled je vais regarder tout ca
Marsh Posté le 10-03-2006 à 22:48:04
sebchap a écrit : Euh, là j'avou ne pas comprendre La redefinition de l'operateur marche très bien et me semble être une facon "propre" de coder, non ? |
euh... Non !
Marsh Posté le 10-03-2006 à 22:50:59
non, comme ils t'ont dis en dehors de la classe pour pouvoir faire
int < annonce ou
annonce < int
+ le constructeur qui permet au compilateur de construire annonce à partir de int
Marsh Posté le 10-03-2006 à 22:53:36
++fab a écrit : euh... Non ! |
Ah d'accord, c'est toujours ca de pris Il y a une raison a ca ?
Sinon j'ai toujours pas compris le Annonce::Annonce(int)
Quel est l'avantage de l'operateur bool operator<( Annonce const& lhs, Annonce const& rhs) par rapport a celui que j'ai defini dans la classe ?
edit: et encore grillé, mais cette fois j'ai compris En plus, j'avais deja etudier le cas du constructeur
Marsh Posté le 10-03-2006 à 23:01:39
sebchap a écrit : Ah d'accord, c'est toujours ca de pris Il y a une raison a ca ? |
Il n'y a pas de raisons formelles, mais tu sens bien que dans ton cas, comparer un int à une annonce, c'est totalement artificiel.
Une annonce, ça se compare à une annonce. Et comment on compare deux annonces ? à toi de voir ... Si c'est en fonction du loyer, et bien tu le défini en fonction.
Citation : Quel est l'avantage de l'operateur bool operator<( Annonce const& lhs, Annonce const& rhs) par rapport a celui que j'ai defini dans la classe ? |
Il compare 2 annonces.
Marsh Posté le 10-03-2006 à 23:42:10
Merci beaucoup a vous tous Ca marche au poil et j'ai compris ce que je faisais
Marsh Posté le 07-03-2006 à 13:18:33
Bonjour ,
Voila le contexte de mon probleme:
J'ai une classe Agence et une autre Annonce. La classe Agence contient theoriquement un tableau d'Annonces (vector<Annonce> _tab), mais j'ai preféré utiliser un vector d'Annonce pour plus de souplesse
La classe Annonce est caractérisé par plusieurs données dont un loyer (int _loyer). On veut faire un classement des Annonces contenues dans l'Agence par montant de loyer croissant.
J'ai donc redéfini l'operator< comme suit:
Lors de la construction d'une Agence, un certain nombre d'Annonces sont ajoutées au vector. Ce que j'ai deja fait, c'est: construire l'Agence avec des Annonces et trier au final le vector avec sort(_tab.begin(), _tab.end())
Ce que je voudrais faire, c'est une methode de la classe Agence pour ajouter une annonce en conservant le tri. J'ai la possibilité d'ajouter l'annonce à la fin du vector (push_back) puis de re-trier le vector, mais ca ne me parait pas très optimisé Au lieu de ca, j'ai pensé utiliser la methode insert des vector avec comme iterateur, celui renvoyé par la methode lower_bound. A priori, c'est exactement ce qu'il me faut, mais evidemment, j'ai des problemes
La fonction sort marche sans probleme et utilise bien mon operator< pour effectuer le tri, mais lower_bound n'a pas l'air d'y arriver
Concretement, voici la fonction que j'utilise:
Et là, c'est le drame A la compilation, il me renvoi une erreur sur l'appelle de lower_bound. Je n'ai pas le message précis sous les yeux, mais de mémoire, il me dit "no match for" la fonction de comparaison utiliser par lower_bound tout en le disant qu'un candidat possible est mon operator< de ma classe Annonce. Ce que je ne comprend pas, c'est pourquoi il n'aime pas mon operateur, alors que la fonction sort s'en contente très bien
J'ai vu dans pas mal d'exemple d'utilisation de lower_bound qu'on declarait un typedef vector<machin>::iterator BIDULE mais ca ne m'a pas sembler necessaire de le faire et je ne pense pas que l'erreur vienne de là. J'ai aussi essayé de creer une autre fonction de comparaison, mais comme ca parlait de pointeur de fonction toussa² (truc que je ne gère absolument pas) le resultat a été desastreux
J'avoue que je suis un peu perdu, donc votre aide est la bienvenue
Merci
P.S: j'utilise g++ 4 si ca peut influencer
Message édité par sebchap le 10-03-2006 à 23:42:48
---------------
BOFH excuse #400:We are Microsoft. What you are experiencing is not a problem; it is an undocumented feature.