У меня есть класс, который представляет список людей.
class AddressBook
{
public:
AddressBook();
private:
std::vector<People> people;
}
Я хочу позволить клиентам перебирать вектор людей. Первая мысль у меня была просто:
std::vector<People> & getPeople { return people; }
Однако я не хочу передавать детали реализации клиенту . Я могу захотеть сохранить определенные инварианты при изменении вектора, и я теряю контроль над этими инвариантами, когда пропускаю реализацию.
Какой лучший способ разрешить итерацию без утечки внутренних данных?
begin()и end()опасно, потому что (1) эти типы являются векторными итераторами (классами), которые не позволяют одному переключиться на другой контейнер, такой как set. (2) Если вектор был изменен (например, вырос или некоторые элементы удалены), некоторые или все итераторы вектора могли быть признаны недействительными.