 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
vincent daanen Guest
|
Posted: Thu Feb 05, 2004 7:25 am Post subject: Quel composant stl utiliser ?? |
|
|
Bonjour a tous
je cherche un composant (de la stl) qui permettent la chose suivante :
+ stocker une valeur (double) associée a un indice (quelconque, pas
forcement 0,1,2,...)
+ faire des op sur la valeur (+,/,*,...)
+ trier le couple (indice,valeur) par rapport aux valeurs
J'ai pense a map (ou multimap) mais il semble que le tri ne puisse se
faire que sur la 'key' et qu'on ne puisse pas demander facilement des op
sur la Data (avec les algo de la stl)
Existe-t-il un tel composant dans la stl ou faut-il que je cree une
classe specifiquement pour cette usage ?
Merci
Vince
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Thu Feb 05, 2004 1:50 pm Post subject: Re: Quel composant stl utiliser ?? |
|
|
vincent daanen <vdaanen_NO_SPAM (AT) yahoo (DOT) fr> wrote
| Quote: | Bonjour a tous
Bonjour. |
| Quote: | je cherche un composant (de la stl) qui permettent la chose suivante :
+ stocker une valeur (double) associée a un indice (quelconque, pas
forcement 0,1,2,...)
+ faire des op sur la valeur (+,/,*,...)
+ trier le couple (indice,valeur) par rapport aux valeurs
J'ai pense a map (ou multimap) mais il semble que le tri ne puisse se
faire que sur la 'key' et qu'on ne puisse pas demander facilement des op
sur la Data (avec les algo de la stl)
Exact, et en lus le tri est fait automatiquement à chaque modification |
du contenu : tu n'as pas à le demander.
| Quote: | Existe-t-il un tel composant dans la stl ou faut-il que je cree une
classe specifiquement pour cette usage ?
Un vector<pair (ou une list ou une dequeu à la place du |
vector) peut-être?
Arnaud
|
|
| Back to top |
|
 |
vincent daanen Guest
|
Posted: Thu Feb 05, 2004 2:34 pm Post subject: Re: Quel composant stl utiliser ?? |
|
|
Arnaud Debaene a écrit :
| Quote: | vincent daanen <vdaanen_NO_SPAM (AT) yahoo (DOT) fr> wrote
Bonjour a tous
Bonjour.
je cherche un composant (de la stl) qui permettent la chose suivante :
+ stocker une valeur (double) associée a un indice (quelconque, pas
forcement 0,1,2,...)
+ faire des op sur la valeur (+,/,*,...)
+ trier le couple (indice,valeur) par rapport aux valeurs
J'ai pense a map (ou multimap) mais il semble que le tri ne puisse se
faire que sur la 'key' et qu'on ne puisse pas demander facilement des op
sur la Data (avec les algo de la stl)
Exact, et en lus le tri est fait automatiquement à chaque modification
du contenu : tu n'as pas à le demander.
Existe-t-il un tel composant dans la stl ou faut-il que je cree une
classe specifiquement pour cette usage ?
Un vector<pair (ou une list ou une dequeu à la place du
vector) peut-être?
|
Je vais essayer mais le tri d'une pair<cle, valeur> parsort se fait-il
sur la cle ou la valeur ??
Dans mon cas, il faut imperativement que ce tri se fasse sur la valeur !!
Merci
Vince
|
|
| Back to top |
|
 |
vincent daanen Guest
|
Posted: Thu Feb 05, 2004 3:02 pm Post subject: Re: Quel composant stl utiliser ?? |
|
|
vincent daanen a écrit :
| Quote: | Existe-t-il un tel composant dans la stl ou faut-il que je cree une
classe specifiquement pour cette usage ?
Un vector<pair (ou une list ou une dequeu à la place du
vector) peut-être?
Je vais essayer mais le tri d'une pair<cle, valeur> parsort se fait-il
sur la cle ou la valeur ??
Dans mon cas, il faut imperativement que ce tri se fasse sur la valeur !!
|
Une fois n'est pas coutune, je me reponds a moi-meme !
En prenant comme cle ma valeur double (et donc comme data la valeur
int), le tri se fait sur la valeur double !!
Ce n'est sans doute pas conseille d'agir comme ca mais ca marche ! Si
quelqu'un a une solution pour que "sort" trie un vector<pair
double>> par rapport a la valeur double ,je suis preneur !!
Vince
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Thu Feb 05, 2004 5:04 pm Post subject: Re: Quel composant stl utiliser ?? |
|
|
vincent daanen wrote:
| Quote: | Je vais essayer mais le tri d'une pair<cle, valeur> parsort se fait-il
sur la cle ou la valeur ??
Dans mon cas, il faut imperativement que ce tri se fasse sur la valeur !!
Une fois n'est pas coutune, je me reponds a moi-meme !
En prenant comme cle ma valeur double (et donc comme data la valeur
int), le tri se fait sur la valeur double !!
Le problème potentiel avec un 'std::map<double, int>', c'est que le |
résultat des comparaisons des valeurs 'double' dépend de la précision
de la machine cible, et par conséquent il peut être difficile de prévoir
si deux clés sont considérées égales ou non :
std::map<double, int> m;
m[0.99999999999999999] = 37;
m[1.0] = 42;
assert(m.size() == 2); // Passe sur certaines machines, casse sur d'autres
À toi de voir si c'est gênant en pratique ou non.
| Quote: |
Ce n'est sans doute pas conseille d'agir comme ca mais ca marche ! Si
quelqu'un a une solution pour que "sort" trie un vector<pair
double>> par rapport a la valeur double ,je suis preneur !!
Définir un functeur de comparaison, le passer comme argument au 'sort' : |
template<typename T1, typename T2>
struct Compare_second
{
bool operator()(std::pair<T1, T2> const& a, std::pair<T1, T2> const& b)
{ return a.second < b.second; }
}; // struct Compare_second
....
std::vector v;
std::sort(v.begin(), v.end(), Compare_second<int, double>());
Dernière remarque : À la place de 'std::pair', je préférerais probablement
utiliser une 'struct' avec des noms de champs plus parlants que 'first' et
'second' ...
Falk
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Thu Feb 05, 2004 7:07 pm Post subject: Re: Quel composant stl utiliser ?? |
|
|
Falk Tannhäuser wrote:
| Quote: | Définir un functeur de comparaison, le passer comme argument au 'sort' :
template<typename T1, typename T2
struct Compare_second
{
bool operator()(std::pair
{ return a.second < b.second; }
}; // struct Compare_second
...
std::vector v;
std::sort(v.begin(), v.end(), Compare_second<int, double>());
Plus simple à l'utilisation : |
struct Compare_second
{
template<typename T1, typename T2>
bool operator()(std::pair<T1, T2> const& a, std::pair<T1, T2> const& b) { return a.second < b.second; }
}; // struct Compare_second
....
std::sort(v.begin(), v.end(), Compare_second());
Falk
|
|
| Back to top |
|
 |
Anthony Jaguenaud Guest
|
Posted: Thu Feb 05, 2004 10:22 pm Post subject: Re: Quel composant stl utiliser ?? |
|
|
vincent daanen wrote:
| Quote: | vincent daanen a écrit :
Une fois n'est pas coutune, je me reponds a moi-meme !
En prenant comme cle ma valeur double (et donc comme data la valeur
int), le tri se fait sur la valeur double !!
Pourquoi ne pas deriver une classe de pair, ou tu surcharges l'operateur |
inférieur ?
--
Anthony
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Feb 06, 2004 2:27 am Post subject: Re: Quel composant stl utiliser ?? |
|
|
On Thu, 05 Feb 2004 16:02:15 +0100, vincent daanen
<vdaanen_NO_SPAM (AT) yahoo (DOT) fr> wrote:
| Quote: | En prenant comme cle ma valeur double (et donc comme data la valeur
int), le tri se fait sur la valeur double
|
Sauf que dans ce cas, des opérations sur les double seront très
compliquées à mettre en place, puisque tu ne peux pas modifier
directement la valeur d'une clef dans un map<>. Il faut enlever la
clef (et la valeur qui va avec) du map<>, modifier le "double", et
réinsérer la clef+la valeur.
--
;-)
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|