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
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;
};
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
 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 << " ";
Et là, distribution.probabilities est le singleton {1}. Alors ma question est: pourquoi l'itérateur est il ignoré ?

Merci de vos éclaircissements.