OVH Cloud OVH Cloud

Quel composant stl utiliser ??

7 réponses
Avatar
vincent daanen
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

7 réponses

Avatar
adebaene
vincent daanen wrote in message news:<bvsr95$l35$...
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<cle, valeur> > (ou une list ou une dequeu à la place du

vector) peut-être?

Arnaud

Avatar
vincent daanen
vincent daanen wrote in message news:<bvsr95$l35$...

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<cle, valeur> > (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


Avatar
vincent daanen
Existe-t-il un tel composant dans la stl ou faut-il que je cree une
classe specifiquement pour cette usage ?



Un vector<pair<cle, valeur> > (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<int,
double>> par rapport a la valeur double ,je suis preneur !!

Vince



Avatar
Falk Tannhäuser
vincent daanen wrote:
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.


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<int,
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<std::pair<int, double> > 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


Avatar
Falk Tannhäuser
Falk Tannhäuser wrote:
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<std::pair<int, double> > 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

Avatar
Anthony Jaguenaud
vincent daanen wrote:

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

Avatar
Fabien LE LEZ
On Thu, 05 Feb 2004 16:02:15 +0100, vincent daanen
wrote:

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.

--
;-)