OVH Cloud OVH Cloud

Définir un type avec valeurs manquantes. Comment faire ?

22 réponses
Avatar
Marc
Bonjour,
je cherche à introduire la notion de valeur manquante pour des objets.
Je me suis dit que les patrons de classe pouvaient être la solution avec une
implémentation du genre :

template <class T >
class CTypeBase {

public :

CTypeBase() : FMissingValue(true),FValue(T()) {}
CTypeBase(const T &x) : FMissingValue(false),FValue(x) {}

bool IsMissingValue(void) const { return FMissingValue;}
void SetMissingValue(void) { FMissingValue=true;}

T GetValue(void) const { return FValue;}
void SetValue(T _value) { FMissingValue=false;FValue=_value;}

// redéfinition des opérateurs dans mon cas ...
// opération avec missing -> missing

private :

bool FMissingValue;
T FValue;

};

typedef CTypeBase<int> CTypeInt;

Ma question :
Pour des gros objets, ça peut convenir, mais pour des int/double/etc, ça
paraît très peu performant !
Surtout si je veux lire/écrire des données sur disque...
Est-ce que quelq'un connaît une solution à ce problème ?

Merci

2 réponses

1 2 3
Avatar
Marc Boyer
Marc wrote:
Bonjour,
je cherche à introduire la notion de valeur manquante pour des objets.


Pour quoi faire ? Quelles opérations permises sur ces objets ?


par exemple :
CTypeInt x,
y; // valeur manquante
CtypeInt z=x+y; // doit me donner valeur manquante or avec le type int
standart, il y a toujours une valeur !


OK.
Disons que pour moi, l'idée de base c'est de ne pas avoir de
constructeur sans paramètre pour éviter le problème.

Surtout si je veux lire/écrire des données sur disque...


Je vois pas le problème là.


et bien ensuite je fais des vecteurs de CTypeInt par exemple, que
j'enregistre dans une base de données au format propre.
En gros, pour le type int, je vais écrire un int et un bool soit 4+1 octets
au lieu de 4 sur mon système.
Avec des données statistiques, c'est un problème classique que de manipuler
des valeurs manquantes (réponse dans des enquêtes, etc.).


OK, une fois vu le contexte, je comprends mieux.
Deux grandes familles de solutions:
1) particulariser une valeur
- pour les entiers, par exemple
limits<T>::max()
définir que limits<CType<T>>::max(){ return limits<T>::max()-1; }
- pour les flottants, on doit avoir NaN (à creuser)
2) une classe simple valeur + bool, et ensuite optimiser les
flux d'E/S si nécessaire (en stoquant par blocs de 8 données,
et en stoquant un unsigned char pour les 8 bool, puis
les 8 valeurs)
cette solution a l'avantage que tu n'as à écrire le flux
que le jour où tu t'apperçois que le pb de perfs est réel.

De toute façon, l'interface devrait permettre de choisir l'une
ou l'autre solution sans modif du code utilisateur.

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...



Avatar
Marc
Je crois que je vais choisir la seconde solution, plus propre...
Marc
1 2 3