Empêcher l’access direct aux touches std :: map

Je voudrais envelopper un std::map pour que le client ne sache pas que je stocke leurs clés de nombre entier positif en tant que nombres entiers négatifs. Je dois permettre de parcourir la classe et d’accéder aux éléments.

J’ai pensé à ce cours:

 template class Container { public: Container(){} void insert(const K& key, const V& value) { _map[key] = value; } bool getFirstElement(K& key, V& value) { if (false == _map.empty()) { _iter = _map.begin(); value = _iter->second; key = std::abs(_iter->first); return true; } return false; } bool getNextElement(K& key, V& value) { ++_iter; if (_iter != _map.end()) { key = std::abs(_iter->first); // I modify the key value = _iter->second; return true; } return false; } private: typename std::map::iterator _iter; // Caches client's position whilst iterating std::map _map; }; 

L’utilisation serait:

 int main() { Container o; o.insert(-1, 100); o.insert(-2, 200); o.insert(-3, 300); int key; int value; o.getFirstElement(key, value); std::cout << "key: " << key << " val: " << value << std::endl; while (o.getNextElement(key, value)) { std::cout << "key: " << key << " val: " << value << std::endl; } } 

Cependant, je n’aime pas avoir deux méthodes pour itérer, d’abord getFirstElement() dehors de la boucle, puis getNextElement() dans la boucle.

Y a-t-il un moyen d’y parvenir afin que le client puisse écrire du code plus ordonné?

 do { std::cout << "key: " << key << " val: " << value << std::endl; }while (o.getNextElement(key, value)); 

Donc, toutes les opérations sont dans la boucle comme ceci.

Je suppose que tu veux ça:

 if( false == o.empty() ) { do { std::cout << "key: " << key << " val: " << value << std::endl; }while (o.getNextElement(key, value)); } 

Juger si c'est 'nul' avant d'obtenir des éléments.