J'ai une classe Foo
qui contient un map
et fournit begin()
et end()
fonctions itérer dessus:Comment adapter un itérateur défini pour qu'il se comporte comme un itérateur de carte?
class Foo {
typedef std::map<int, double> Container;
typedef Container::const_iterator const_iterator;
Container c_;
public:
const_iterator begin() const { return c_.begin(); }
const_iterator end() const { return c_.end(); }
void insert(int i, double d) { c_[i] = d; }
// ...
};
Maintenant, je voudrais changer intérieurement de std::map<int, double>
juste un std::set<int>
, mais je ne veux pas pour casser n'importe quel code client.
Donc le double d
dans la fonction insert
serait maintenant simplement ignoré. Et le code suivant doit encore être valide, où it->second
sera maintenant juste toujours 0.0
:
Foo foo;
for(Foo::const_iterator it = foo.begin(); it != foo.end(); ++it) {
std::cout << it->first << " " << it->second << std::endl;
}
Comment puis-je faire ces changements dans la classe Foo
?
En d'autres termes, comment puis-je fournir un Foo::const_iterator
qui adapte le nouveau std::set<int>::const_iterator
interne pour qu'il se comporte comme l'ancien std::map<int,double>::const_iterator
?
MISE À JOUR: La raison pour laquelle je veux me débarrasser du map
est l'efficacité de la mémoire. J'ai des millions de Foo
instances et ne peut pas se permettre de stocker les valeurs double
en eux.
Pour être honnête, cela semble être une très mauvaise idée. Garder le contrat compatible lorsque la sémantique a complètement changé n'est pas significatif. –
@KonradRudolph C++ fait cela depuis le premier jour. – wilhelmtell
@wilhelm: C'est vrai. Mais pas une raison de faire la même chose. –