[C++] STL map et sort

STL map et sort [C++] - C++ - Programmation

Marsh Posté le 31-01-2003 à 19:10:19    

J'ai une map de la stl qui est definie comme suit :
 
 
 

Code :
  1. ...
  2. class ma_classe
  3. {
  4.     private:
  5.     ...
  6.     public:
  7.     ma_classe();
  8.     ~ma_classe();
  9.     int nombre;
  10.     ...
  11. };
  12. std::map<int, ma_classe *> ma_map;
  13. sort(ma_map.begin(),ma_map.end(),compare_moi_tout_ca);

 
 
J'aimerais savoir comment faire un sort de la map selon la variable membre ma_classe::nombre
J'ai essaye ca et qq variantes mais le compilo ne digere pas :
 

Code :
  1. class compare_moi_tout_ca : public std::binary_function<ma_classe * , ma_classe * ,bool>
  2. {
  3. public:
  4. bool operator()( ma_classe * x , ma_classe * y) const
  5. {return ((x->nombre) < (y->nombre));}
  6. };

 
 

Reply

Marsh Posté le 31-01-2003 à 19:10:19   

Reply

Marsh Posté le 31-01-2003 à 19:15:15    

ça n'a pas de sens de trier une map puisque dans sa structure interne, elle obéit déjà à un critère : less<KeyType> par défaut ou tout autre fonction passée en troisième paramètre. de toute façon map ne fournit pas de RandomAccessIterator
 
ça veut dire quoi pas digéré?


Message édité par Taz le 31-01-2003 à 19:21:04
Reply

Marsh Posté le 31-01-2003 à 21:34:04    

indigestion ...  
ben indigeste quoi :D
 

Code :
  1. g++ -Wall -ansi -I/usr/include -c main.cpp
  2. /usr/include/g++/bits/stl_algo.h: In function `void
  3.    std::sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with
  4.    _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int,
  5.    ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned
  6.    int, ma_classe*>*>, _Compare = compare_moi_tout_ca]':
  7. main.cpp:436:   instantiated from here
  8. /usr/include/g++/bits/stl_algo.h:2209: no match for `
  9.    std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  10.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  11.    ma_classe*>*>& - std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  12.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  13.    ma_classe*>*>&' operator
  14. /usr/include/g++/bits/stl_algo.h: In function `void
  15.    std::__final_insertion_sort(_RandomAccessIter, _RandomAccessIter, _Compare)
  16.    [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned
  17.    int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const
  18.    unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]':
  19. /usr/include/g++/bits/stl_algo.h:2210:   instantiated from `void std::sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  20. main.cpp:436:   instantiated from here
  21. /usr/include/g++/bits/stl_algo.h:2074: no match for `
  22.    std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  23.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  24.    ma_classe*>*>& - std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  25.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  26.    ma_classe*>*>&' operator
  27. /usr/include/g++/bits/stl_algo.h:2075: no match for `
  28.    std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  29.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  30.    ma_classe*>*>& + std::<anonymous enum>' operator
  31. /usr/include/g++/bits/stl_algo.h:2076: no match for `
  32.    std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  33.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  34.    ma_classe*>*>& + std::<anonymous enum>' operator
  35. /usr/include/g++/bits/stl_algo.h: In function `void
  36.    std::__insertion_sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with
  37.    _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int,
  38.    ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned
  39.    int, ma_classe*>*>, _Compare = compare_moi_tout_ca]':
  40. /usr/include/g++/bits/stl_algo.h:2079:   instantiated from `void std::__final_insertion_sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  41. /usr/include/g++/bits/stl_algo.h:2210:   instantiated from `void std::sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  42. main.cpp:436:   instantiated from here
  43. /usr/include/g++/bits/stl_algo.h:2004: no match for `
  44.    std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  45.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  46.    ma_classe*>*>& + int' operator
  47. /usr/include/g++/bits/stl_algo.h:2079:   instantiated from `void std::__final_insertion_sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  48. /usr/include/g++/bits/stl_algo.h:2210:   instantiated from `void std::sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  49. main.cpp:436:   instantiated from here
  50. /usr/include/g++/bits/stl_algo.h:2007: no match for call to `(compare_moi_tout_ca) (
  51.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  52.    ma_classe*>&)'
  53. main.cpp:32: candidates are: bool compare_moi_tout_ca::operator()(ma_classe*, ma_classe*) const
  54. /usr/include/g++/bits/stl_algo.h:2008: no match for `
  55.    std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>,
  56.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  57.    ma_classe*>*>& + int' operator
  58. /usr/include/g++/bits/stl_algo.h: In member function `std::pair<const unsigned
  59.    int, ma_classe*>& std::pair<const unsigned int, ma_classe*>::operator=(const
  60.    std::pair<const unsigned int, ma_classe*>&)':
  61. /usr/include/g++/bits/stl_algo.h:2009: non-static const member `const unsigned
  62.    int std::pair<const unsigned int, ma_classe*>::first', can't use default
  63.    assignment operator
  64. /usr/include/g++/bits/stl_algo.h: In function `void
  65.    std::__unguarded_linear_insert(_RandomAccessIter, _Tp, _Compare) [with
  66.    _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int,
  67.    ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned
  68.    int, ma_classe*>*>, _Tp = std::pair<const unsigned int, ma_classe*>, _Compare =
  69.    compare_moi_tout_ca]':
  70. /usr/include/g++/bits/stl_algo.h:2012:   instantiated from `void std::__insertion_sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  71. /usr/include/g++/bits/stl_algo.h:2079:   instantiated from `void std::__final_insertion_sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  72. /usr/include/g++/bits/stl_algo.h:2210:   instantiated from `void std::sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = std::_Rb_tree_iterator<std::pair<const unsigned int, ma_classe*>, std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int, ma_classe*>*>, _Compare = compare_moi_tout_ca]'
  73. main.cpp:436:   instantiated from here
  74. /usr/include/g++/bits/stl_algo.h:1961: no match for call to `(compare_moi_tout_ca) (
  75.    std::pair<const unsigned int, ma_classe*>&, std::pair<const unsigned int,
  76.    ma_classe*>&)'
  77. main.cpp:32: candidates are: bool compare_moi_tout_ca::operator()(ma_classe*, ma_classe*) const
  78. make: *** [main.o] Error 1

 
 
bon je dois conclure que il n'y a pas moyen d'ordonner une map de la maniere dont on veut ?
ca me parait bizarre.

Reply

Marsh Posté le 31-01-2003 à 21:38:21    

j'en déduis que tu sais pas lire  :pfff:

Reply

Marsh Posté le 31-01-2003 à 21:41:32    

ah oui c'est bien possible :)

Reply

Marsh Posté le 31-01-2003 à 21:42:08    

alligator421 a écrit :

ah oui c'est bien possible :)

t'as compris alors?

Reply

Marsh Posté le 31-01-2003 à 21:47:16    

bah pas vraiment :/
a part le no-match .... pati pata ... random acess iterator
et de fait sur www.sgi.com/tech/stl , seul deque et vector procure un random access iterator
enfin bon c'est sympa mais il y a bien un work-around pour trier cette map quand meme non ?

Reply

Marsh Posté le 31-01-2003 à 21:49:19    

alligator421 a écrit :


enfin bon c'est sympa mais il y a bien un work-around pour trier cette map quand meme non ?


 
la map est deja triee
l'ordre est fixe a la creation par le predicat
less passe en parametre du template.
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 31-01-2003 à 21:51:19    

t'es long à viendre ou tu comprends vite mais faut t'expliquer longtemps?

Reply

Marsh Posté le 31-01-2003 à 21:55:19    

legreg a écrit :


 
la map est deja triee
l'ordre est fixe a la creation par le predicat
less passe en parametre du template.
 
LeGreg
 


 
 
mmmh
bon ca n'arrange pas mes affaires tout ca.
je vais devoir prendre chaque value correspondant aux keys et regarder ce que je veux dedans pour mettre dans un autre container.
 
Merci tous les deux pour vos reponses.
 
:hello:
 
 
 
 
 
 

Reply

Marsh Posté le 31-01-2003 à 21:55:19   

Reply

Marsh Posté le 31-01-2003 à 21:57:58    

++Taz a écrit :

t'es long à viendre ou tu comprends vite mais faut t'expliquer longtemps?


 
pas la peine de me secouer, je suis deja parti.

Reply

Marsh Posté le 31-01-2003 à 21:58:38    

:heink: tu comprends bien qu'on peut avoir un autre ordre que less? c'est réorganiser la map qui impossible. il faut en créer une autre avec un autre prédicat.

Reply

Marsh Posté le 31-01-2003 à 22:02:40    

++Taz a écrit :

:heink: tu comprends bien qu'on peut avoir un autre ordre que less? c'est réorganiser la map qui impossible. il faut en créer une autre avec un autre prédicat.


 
si j'ai compris, mais ca ne m'arrange pas (voir mon premier post)
je voulais faire un sort sur la valeur pas sur la key less<keytype>.  
De plus ma map est deja cree.

Reply

Marsh Posté le 31-01-2003 à 22:07:25    

effectivement...

Reply

Sujets relatifs:

Leave a Replay

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