tgoop.com/cpluspluc/1131
Create:
Last Update:
Last Update:
🎯 C++ Задача для опытных разработчиков: «Хитрый итератор»
У вас есть следующая структура:
std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Нужно реализовать итератор, который будет проходить по
data
следующим образом:- сначала возьмёт первый элемент,
- затем последний,
- затем второй,
- затем предпоследний,
- и так далее — «сжимая» список с двух концов.
🧠 *Вопрос:* Как бы вы реализовали такой итератор в стиле STL (`begin()` / `end()`), совместимый с range-based for?
🧩 Подсказка:
Нужно симулировать два указателя:
left
и right
, с шагом +1 и -1 соответственно, и внутри итератора отслеживать, с какой стороны взять следующий элемент.✅ Возможный подход:
Создаём кастомный класс
ZigZagIterator
, внутри которого:-
operator++()
переключает сторону (`left` / `right`),-
operator*()
возвращает нужный элемент в текущем шаге,-
operator!=()
сравнивает позиции указателей.🔍 Пример:
class ZigZagIterator {
public:
ZigZagIterator(const std::vector<int>& vec, bool end = false)
: data(vec), left(0), right(vec.size() - 1), useLeft(true), done(end) {}
int operator*() const {
return useLeft ? data[left] : data[right];
}
ZigZagIterator& operator++() {
if (useLeft) ++left;
else --right;
if (left > right) done = true;
useLeft = !useLeft;
return *this;
}
bool operator!=(const ZigZagIterator& other) const {
return done != other.done;
}
private:
const std::vector<int>& data;
size_t left, right;
bool useLeft;
bool done;
};
class ZigZagRange {
public:
ZigZagRange(const std::vector<int>& vec) : data(vec) {}
ZigZagIterator begin() const { return ZigZagIterator(data); }
ZigZagIterator end() const { return ZigZagIterator(data, true); }
private:
const std::vector<int>& data;
};
📌 Использование:
for (int val : ZigZagRange(data)) {
std::cout << val << " ";
}
// Output: 1 10 2 9 3 8 4 7 5 6
📎 *Что здесь интересно:*
- Работа с нестандартной логикой обхода в рамках C++ STL-подобного интерфейса.
- Умение проектировать удобные и безопасные итераторы.
- Поддержка
range-based for
без копирования данных.🛠️ *Идея для расширения:* добавить
operator--()
и реализовать двунаправленный итератор.BY C++ Academy
Share with your friend now:
tgoop.com/cpluspluc/1131