Salut à toutes et à tous!
J'ai souvent le problème de devoir mapper un ensemble discret X vers les entiers naturels N grâce une relation d'ordre, pour pouvoir utiliser des structures qui fonctionnent avec des indices (matrices, vecteurs etc).
Par exemple quand je calcule des distances élément par élément d'un ensemble X, j'ai envie de stocker ces valeurs dans une matrice que je planque derrière une petite classe PairwiseMatrix, ce qui revient à devoir attribuer un indice (un peu arbitraire) à chaque élément de X. Si j'ai envie d'accéder plus tard à la distance entre deux éléments a et b de X, je dois retrouver les indices correspondants avec une code du genre:
Si c'est limité à une seule classe, ça va. Le truc c'est que ce genre de code pour switcher entre X et N commence à se retrouve partout dans le projet. C'est normal/préoccupant/lourd ?
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
19
20
21 class PairwiseMatrix { // Constructeur pour calculer f(a,b) pour tout couple a,b appartenant à X^2 // Les indices sont donnés par l'ordre des points dans le vecteur p Pariwise(std::vector<T> const& p, F f): m_points(p), m_matrix(construct_matrix(p, f)) {} unsigned int ID(T const& x) const { auto it = std::find(m_points.begin(), m_points.end(), x); // m_points conserve l'ordre des éléments donné à la construction avec un std::vector assert( it != m_points.end()); return std::distance(m_points.begin(), it); } auto operator()(T const& x, T const& y) const { return m_matrix(ID(x),ID(y)); } }
J'hésite à ordonner le vecteur d'éléments de X une bonne fois pour toute dès le début du code, et ne concevoir le reste de la bibliothèque que pour des éléments de type intégral.
Ca revient à buter pas mal de boulot (à la qualité discutable, comme vous le voyez).
Que me conseillez-vous, et comment vous y prenez vous habituellement ?
Merci
Partager