Eu tenho uma classe que representa uma lista de pessoas.
class AddressBook
{
public:
AddressBook();
private:
std::vector<People> people;
}
Eu quero permitir que os clientes iterem sobre o vetor de pessoas. O primeiro pensamento que tive foi simplesmente:
std::vector<People> & getPeople { return people; }
No entanto, não quero vazar os detalhes de implementação para o cliente . Talvez eu queira manter certos invariantes quando o vetor é modificado e perco o controle sobre esses invariantes quando vazo a implementação.
Qual é a melhor maneira de permitir a iteração sem vazar os internos?
begin()
e end()
é perigoso porque (1) esses tipos são iteradores de vetores (classes) que impedem que um alterne para outro contêiner, como a set
. (2) Se o vetor for modificado (por exemplo, crescido ou alguns itens apagados), alguns ou todos os iteradores do vetor poderão ter sido invalidados.