[C++] Priority_queue/Vector

Priority_queue/Vector [C++] - C++ - Programmation

Marsh Posté le 20-06-2005 à 11:11:47    

Bonjour,
J'ai besoin d'utiliser une priority_queue afin de classer une serie de classe (Ce qui fonctionne sans probleme).
Le sous-container (Ca s'appel comme ca?) utilise est un vector.
Mon probleme est le suivant:
Je souheterai lire le contenu du vector, mais sans le modifier, c'est-a-dire que je ne peux pas utiliser top() puis pop(), qui viderait le vector. Or il ne doit pas etre modifie.
Je dois aussi pouvoir supprimer une entree de mon choix, quelque soit sa position dans le vector.
Il n'existe pas d'iterator ni d'operator[] pour la priority_queue et ca m'embete franchement, de plus je ne suis pas encore tres a l'aise avec les STL.
 
Est-ce que quelqu'un aurait une idee ?
 
Merci :)

Reply

Marsh Posté le 20-06-2005 à 11:11:47   

Reply

Marsh Posté le 20-06-2005 à 12:37:00    

Up  :cry:

Reply

Marsh Posté le 20-06-2005 à 14:48:45    

ben utilise vector, vu que c'est que les opérations dont tu as besoin ne sont pas applicables à un vector. Si c'est l'ordre qui t'intéresse, un set peut t'aider. Voir aussi make_heap et ses amis

Reply

Marsh Posté le 20-06-2005 à 15:09:06    

Taz a écrit :

ben utilise vector, vu que c'est que les opérations dont tu as besoin ne sont pas applicables à une priority_queue. Si c'est l'ordre qui t'intéresse, un set peut t'aider. Voir aussi make_heap et ses amis


Petite faute je suppose ;)
 
Merci pour cette reponse,
En effet l'ordre m'interesse, il s'agit ici de classer une serie de calques (A la maniere photoshop/gimp) qui seront ensuite lu en partant du premier jusqu'au dernier.
L'ordre est donc d'importance cruciale.
J'avais entendu parler de make_heap, je vais me renseigner un peu plus la dessus :)
 
Merci !

Reply

Marsh Posté le 20-06-2005 à 17:10:52    

Re,
J'ai finalement decide d'implementer ma propre classe base sur les vector.
J'ai cependant un soucis assez etrange a la declaration d'un iterator de vector dans la fonction suivante:

Code :
  1. template <class T>
  2. void CPriorityVector<T>::push(T Obj)
  3. {
  4.   std::vector<T>::iterator itData;
  5.   for (itData = m_Vec.begin(); itData < m_Vec.end(); itData++)
  6.   {
  7.     if (Obj < *itData)
  8.     {
  9.       m_Vec.insert(itData, Obj);
  10.       return;
  11.     }
  12.   }
  13.   m_Vec.insert(m_Vec.end(), Obj);
  14. }


 
Voici l'erreur de G++:

barney% make PriorityVector.o
g++ -Wall -W -ansi -pedantic  -g  -c -o PriorityVector.o PriorityVector.cpp
PriorityVector.cpp: In member function `void CPriorityVector<T>::push(T)':
PriorityVector.cpp:4: error: syntax error before `;' token
make: *** [PriorityVector.o] Error 1


Sans les options -ansi et -pedantic:

barney% g++ -c PriorityVector.cpp
PriorityVector.cpp: In member function `void CPriorityVector<T>::push(T)':
PriorityVector.cpp:4: warning: `std::vector<T, std::allocator<_CharT>  
   >::iterator' is implicitly a typename
PriorityVector.cpp:4: warning: implicit typename is deprecated, please see the  
   documentation for details


P.S: J'ai adapte les numeros de lignes, car tout le .cpp n'est pas copie ici.
 
Ca compile correctement avec le compilateur C++ de Hewlett-packard.
 
Ai-je fait quelque chose qui ne soit pas a la norme ?
 
Merci d'avance!


Message édité par deather2 le 20-06-2005 à 17:11:28
Reply

Marsh Posté le 20-06-2005 à 17:53:53    

t'as qu'à lire le topic sur typename. Moi je te conseille d'utiliser les fonctions make_heap et tout ça, et de cacher ça dans une classe si tu veux. Mais évite de réinventer la roue à tout recoder

Reply

Marsh Posté le 20-06-2005 à 18:24:44    

Merci pour l'indication typename, ca compile maintenant.
En ce qui concerne la reinvention de la roue, je comprend tout a fait, mais mon code me suffit et je comprend mieux comment ca marche...
Merci a toi en tout cas!

Reply

Marsh Posté le 20-06-2005 à 18:50:29    

oui il te suffit mais il est peu efficace. ça te demande très peu de travail !
 

Code :
  1. template <typename T>
  2. void CPriorityVector<T>::push(const T& Obj)
  3. {
  4.    this->m_Vec.push_back(Obj);
  5.    std::push_heap(this->m_Vec.begin(), this->m_Vec.end());
  6. }


 
simple non ?

Reply

Marsh Posté le 20-06-2005 à 19:07:07    

Effectivement, vu comme ca !
Je vais essayer d'utiliser ca alors, merci encore pour ton aide c'est sympa ;)

Reply

Marsh Posté le 20-06-2005 à 19:26:28    

list bien la documentation, le pop est aussi simple que le push.

Reply

Marsh Posté le 20-06-2005 à 19:26:28   

Reply

Marsh Posté le 20-06-2005 à 20:28:52    

Re,
J'ai tout refait en utilisant les heap.
Je me retrouve neamoins confronte au meme probleme que je rencontrais avec ma methode, a savoir les erreures suivantes au link:

Test.o(.text+0x76): In function `main':
: undefined reference to `CPriorityVector<CTest>::push(CTest const& )'
Test.o(.text+0x88): In function `main':
: undefined reference to `CPriorityVector<CTest>::push(CTest const& )'
Test.o(.text+0x9a): In function `main':
: undefined reference to `CPriorityVector<CTest>::push(CTest const& )'
Test.o(.text+0xb4): In function `main':
: undefined reference to `CPriorityVector<CTest>::pop()'


 
Voici le code source des 3 fichiers:
 
PriorityVector.hpp:

Code :
  1. #include <vector>
  2. #include <algorithm>
  3. template <typename T>
  4. class CPriorityVector
  5. {
  6. protected:
  7.   std::vector<T>        m_Vec;
  8. public:
  9.   void  push(const T& Obj);
  10.   T&    pop(void);
  11. };


 
PriorityVector.cpp:

Code :
  1. #include "PriorityVector.hpp"
  2. template <typename T>
  3. void CPriorityVector<T>::push(const T& Obj)
  4. {
  5.   this->m_Vec.push_back(Obj);
  6.   std::push_heap(this->m_Vec.begin(), this->m_Vec.end());
  7. }
  8. template <typename T>
  9. T& CPriorityVector<T>::pop(void)
  10. {
  11.   return std::pop_heap(this->m_Vec.begin(), this->m_Vec.end());
  12. }


 
Test.cpp:

Code :
  1. #include "PriorityVector.hpp"
  2. #include <iostream>
  3. using namespace std;
  4. class CTest
  5. {
  6. public:
  7.   int prio;
  8.   CTest(int _prio){prio=_prio;};
  9.   ~CTest(){};
  10.   int operator<(const CTest& x)
  11.     {
  12.       return x.prio < this->prio;
  13.     }
  14. };
  15. int main(void)
  16. {
  17.   CPriorityVector<CTest> PrVec;
  18.   CTest Test1(1);
  19.   CTest Test2(10);
  20.   CTest Test3(5);
  21.   CTest Result(0);
  22.   PrVec.push(Test1);
  23.   PrVec.push(Test2);
  24.   PrVec.push(Test3);
  25.   int i;
  26.   for (i = 0; i < 3; i++)
  27.   {
  28.     Result = PrVec.pop();
  29.     cout << Result.prio << endl;
  30.   }
  31. }


 
Quelque chose ne va pas?
 
Encore merci !!


Message édité par deather2 le 20-06-2005 à 20:31:21
Reply

Marsh Posté le 20-06-2005 à 21:12:28    

Reply

Marsh Posté le 20-06-2005 à 21:17:39    

Lol tu as lu le premier post ? :D
Justement j'utilisais ca au debut, mais ca ne me convient pas tout a fait non ;)
 
Merci quand meme

Reply

Marsh Posté le 20-06-2005 à 21:21:07    

Oups, désolé.
 
Pour ton pb, il faut mettre le code de la classe template dans le .hpp, autrement dire coller le code de ton PriorityVector.cpp dans ton .hpp. C'est une restriction des compilos pour les templates  (ou plus exactement du linker puisque celui-ci a besoin de classes "réelles", ce que ne sont pas les templates).
 
Bon, si je dis une connerie, Taz ne manquera pas de la relever...


Message édité par el muchacho le 20-06-2005 à 21:32:23
Reply

Marsh Posté le 20-06-2005 à 21:30:52    

Arrfff !! C'etait juste ca :D
Merci a toi ca roule ;)

Reply

Marsh Posté le 20-06-2005 à 22:52:31    

pop(void); n'a aucun sens. Rien, ça s'écrit ()
 
ensuite ton pop qui renvoie une &, j'y crois pas trop
 
# template <typename T>
# T& CPriorityVector<T>::pop(void)
# {
#   return std::pop_heap(this->m_Vec.begin(), this->m_Vec.end());
# }
 
surtout que pop_heap renvoie void ...  
 
 
#   int operator<(const CTest& x)
#     {
#       return x.prio < this->prio;
#     }
 
 
foutage de gueule
 
#   bool operator<(const CTest& x) const
#     {
#       return x.prio < this->prio;
#     }
 
 
# ~CTest(){};
 
s'il est vide ben l'écris pas !
 
 
# CTest(int _prio){prio=_prio;};
 
beurl
 
# CTest(int _prio) : prio(_prio) { };
 
 
sinon elle est nulle ta notation de foutre des C partout, ça rime à rien.

Reply

Marsh Posté le 26-06-2005 à 17:29:34    

Taz a écrit :

sinon elle est nulle ta notation de foutre des C partout, ça rime à rien.


Heu c'est la notation officielle MFC  :whistle:

Reply

Marsh Posté le 26-06-2005 à 18:27:55    

ça rime à rien quoi. T'as qu'à foutre des v devant toutes les variables, des f devant les fonctions, des n devant les namespace, etc.

Reply

Marsh Posté le 26-06-2005 à 18:40:28    

Pourquoi tu n'utilises pas la notation hongroise (je crois que c'est comme ça qu'elle s'appelle) avec des préfixes d'attributs m_sz, m_b, m_n et j'en passe?

Reply

Marsh Posté le 26-06-2005 à 18:51:10    

ce qui y a de bien avec la notation hongroise, c'est les gens qui comprennes meme pas ce qu'ils écrivent. genre
 
string m_csz;
 
manque de bol, une string n'est pas terminée par un 0 ...

Reply

Marsh Posté le 26-06-2005 à 18:58:31    

string m_strString ou CString m_strString
Génial même notation pour C++ et MFC!!

Reply

Marsh Posté le 26-06-2005 à 19:36:10    

je comprends rien. Je chie sur MFC.

Reply

Marsh Posté le 27-06-2005 à 09:31:31    

Ben heu bon on va en rester là alors  :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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