Bonjour,
J'ai une liste d'éléments (int) et de poids (double) en entrée, je veux faire un tirage aléatoire d'un élément pondéré par les poids donnés.
L'entrée est sous forme d'un vector<int, double>.
La classe discrete_distribution semble idéale pour le tirage, cependant le format de l'entrée n'est pas adapté au constructeur.
Première solution: je copie tout les poids dans un vector<double> et j'ai ma distribution. Sauf que ce n'est pas élégant, et ça demande de dupliquer les poids et donc de perdre du temps.
Je me suis donc tourné vers une deuxième solution: surcharger un iterator: j'ai donc la classe
Bon, tout a l'air bien de ce côté, maintenant on crée la distribution:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 template <typename U, typename V> class secondTermIterator : public std::vector<V>::iterator{//std::iterator<std::bidirectional_iterator_tag,std::pair<U,V> > { public: typedef std::pair<U,V> pair; typedef typename std::vector<pair >::iterator iterator; secondTermIterator() {} secondTermIterator(iterator j) : i(j) {} secondTermIterator& operator++() { ++i; return *this; } secondTermIterator operator++(int) { auto tmp = *this; ++(*this); return tmp; } secondTermIterator& operator--() { --i; return *this; } secondTermIterator operator--(int) { auto tmp = *this; --(*this); return tmp; } bool operator==(secondTermIterator j) const { return i == j.i; } bool operator!=(secondTermIterator j) const { return !(*this == j); } V& operator*() { return i->second; } V* operator->() { return &i->second; } protected: iterator i; };
Et là, distribution.probabilities est le singleton {1}. Alors ma question est: pourquoi l'itérateur est il ignoré ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 vector<pair<int, double> > c; //On remplie c ici, par exemple: c.push_back(pair<int, double>(42,4.2)); c.push_back(pair<int, double>(53,1.7)); c.push_back(pair<int, double>(102,3.3)); // auto itb=secondTermIterator<size_t, double>(c.begin()); auto ite=secondTermIterator<size_t, double>(c.end()); discrete_distribution<int> distribution(itb,ite); //On vérifie que la construction est correcte for (double x:distribution.probabilities()) std::cout << x << " ";
Merci de vos éclaircissements.
Partager