J'ai une classe qui représente une liste de personnes.
class AddressBook
{
public:
AddressBook();
private:
std::vector<People> people;
}
Je veux permettre aux clients d'itérer sur le vecteur des personnes. La première pensée que j'ai eue était simplement:
std::vector<People> & getPeople { return people; }
Cependant, je ne veux pas divulguer les détails de l'implémentation au client . Je peux vouloir conserver certains invariants lorsque le vecteur est modifié, et je perds le contrôle de ces invariants lorsque je fuit l'implémentation.
Quelle est la meilleure façon de permettre l'itération sans fuir les internes?
begin()
et end()
sont dangereux car (1) ces types sont des itérateurs de vecteurs (classes) qui empêchent l'un de basculer vers un autre conteneur tel que a set
. (2) Si le vecteur est modifié (par exemple, développé ou certains éléments effacés), certains ou tous les itérateurs de vecteur pourraient avoir été invalidés.