Ho una classe che rappresenta un elenco di persone.
class AddressBook
{
public:
AddressBook();
private:
std::vector<People> people;
}
Voglio consentire ai clienti di scorrere sul vettore delle persone. Il primo pensiero che ho avuto è stato semplicemente:
std::vector<People> & getPeople { return people; }
Tuttavia, non voglio far trapelare i dettagli dell'implementazione al client . Potrei voler mantenere determinati invarianti quando il vettore viene modificato e perdo l'implementazione perdendo il controllo su questi invarianti.
Qual è il modo migliore per consentire l'iterazione senza perdite dagli interni?
begin()
e end()
sono pericolosi perché (1) quei tipi sono iteratori di vettori (classi) che impediscono a uno di passare a un altro contenitore come a set
. (2) Se il vettore viene modificato (ad es. Cresciuto o alcuni elementi cancellati), alcuni o tutti gli iteratori vettoriali potrebbero essere stati invalidati.