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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Priority_queue/Vector

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Priority_queue/Vector

n°1125061
deather2
Posté le 20-06-2005 à 11:11:47  profilanswer
 

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 :)

mood
Publicité
Posté le 20-06-2005 à 11:11:47  profilanswer
 

n°1125131
deather2
Posté le 20-06-2005 à 12:37:00  profilanswer
 

Up  :cry:

n°1125237
Taz
bisounours-codeur
Posté le 20-06-2005 à 14:48:45  profilanswer
 

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

n°1125251
deather2
Posté le 20-06-2005 à 15:09:06  profilanswer
 

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 !

n°1125378
deather2
Posté le 20-06-2005 à 17:10:52  profilanswer
 

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
n°1125436
Taz
bisounours-codeur
Posté le 20-06-2005 à 17:53:53  profilanswer
 

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

n°1125463
deather2
Posté le 20-06-2005 à 18:24:44  profilanswer
 

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!

n°1125473
Taz
bisounours-codeur
Posté le 20-06-2005 à 18:50:29  profilanswer
 

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 ?

n°1125483
deather2
Posté le 20-06-2005 à 19:07:07  profilanswer
 

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

n°1125491
Taz
bisounours-codeur
Posté le 20-06-2005 à 19:26:28  profilanswer
 

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

mood
Publicité
Posté le 20-06-2005 à 19:26:28  profilanswer
 

n°1125531
deather2
Posté le 20-06-2005 à 20:28:52  profilanswer
 

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
n°1125605
el muchach​o
Comfortably Numb
Posté le 20-06-2005 à 21:12:28  profilanswer
 
n°1125611
deather2
Posté le 20-06-2005 à 21:17:39  profilanswer
 

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

n°1125613
el muchach​o
Comfortably Numb
Posté le 20-06-2005 à 21:21:07  profilanswer
 

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
n°1125625
deather2
Posté le 20-06-2005 à 21:30:52  profilanswer
 

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

n°1125720
Taz
bisounours-codeur
Posté le 20-06-2005 à 22:52:31  profilanswer
 

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.

n°1131364
slash33
Posté le 26-06-2005 à 17:29:34  profilanswer
 

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:

n°1131393
Taz
bisounours-codeur
Posté le 26-06-2005 à 18:27:55  profilanswer
 

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

n°1131396
slash33
Posté le 26-06-2005 à 18:40:28  profilanswer
 

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?

n°1131401
Taz
bisounours-codeur
Posté le 26-06-2005 à 18:51:10  profilanswer
 

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

n°1131407
slash33
Posté le 26-06-2005 à 18:58:31  profilanswer
 

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

n°1131440
Taz
bisounours-codeur
Posté le 26-06-2005 à 19:36:10  profilanswer
 

je comprends rien. Je chie sur MFC.

n°1131862
slash33
Posté le 27-06-2005 à 09:31:31  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  [C++] Priority_queue/Vector

 

Sujets relatifs
Récupérer l'heure du système avec un std::vector<int>Débutant: vector non reconnu
[JAVA]Afficher un vector dans un JtableSTL - map pair vector - documentation ?
Probleme avec un Vector (élément écrasé lors du .add() )Différence entre string et vector<char>
trie tableau vector... (very debutant) help me please[C++] classe Vector pas puissante ?
Classe Vector sou super Waba (pour PDA)Ajouter des éléments dans un vector.
Plus de sujets relatifs à : [C++] Priority_queue/Vector


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