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