CPLUSPLUC Telegram 1131
🎯 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--() и реализовать двунаправленный итератор.



tgoop.com/cpluspluc/1131
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

Unlimited number of subscribers per channel Just as the Bitcoin turmoil continues, crypto traders have taken to Telegram to voice their feelings. Crypto investors can reduce their anxiety about losses by joining the “Bear Market Screaming Therapy Group” on Telegram. Telegram channels fall into two types: It’s easy to create a Telegram channel via desktop app or mobile app (for Android and iOS): Hui said the time period and nature of some offences “overlapped” and thus their prison terms could be served concurrently. The judge ordered Ng to be jailed for a total of six years and six months.
from us


Telegram C++ Academy
FROM American