Iterateurs et discrete_distribution
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:
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:
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.