Добавьте begin() и end(), возвращающие итераторы внутреннего vector. Константные перегрузки позволят тем же способом обходить const UserCollection; специальные операторы не нужны.
Как сделать UserCollection пригодным для range‑based цикла без доступа к полю
Добавьте begin() и end(), возвращающие итераторы внутреннего vector. Константные перегрузки позволят тем же способом обходить const UserCollection; специальные операторы не нужны.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо изменить структуру UserCollection, чтобы её можно было использовать в range‑based for без обращения к внутреннему массиву.
struct UserCollection {
std::vector<int> arr;
// какие члены/операторы добавить?
};
void rangeFunc() {
UserCollection col;
for (const auto& item : col) {
// ...
}
}
Требуется добавить в структуру необходимые типы‑алиасы, методы begin() и end() (или соответствующие свободные функции), которые будут возвращать итераторы контейнера arr, чтобы цикл for (const auto& item : col) работал напрямую.
Ответ
Добавьте begin() и end(), возвращающие итераторы внутреннего vector. Константные перегрузки позволят тем же способом обходить const UserCollection; специальные операторы не нужны.
struct UserCollection {
std::vector<int> arr;
using iterator = std::vector<int>::iterator;
using const_iterator = std::vector<int>::const_iterator;
iterator begin() noexcept { return arr.begin(); }
iterator end() noexcept { return arr.end(); }
const_iterator begin() const noexcept { return arr.begin(); }
const_iterator end() const noexcept { return arr.end(); }
};
Типы-алиасы удобны, но сам range-based for их не требует. Он получает границы диапазона и последовательно разыменовывает итератор. Пустой arr корректен: тело цикла ни разу не выполнится. Модификации vector во время обхода требуют учёта инвалидации.