💽 KDiskMark — удобный бенчмарк дисков с графическим интерфейсом. Этот инструмент на Qt упрощает тестирование скорости HDD и SSD, скрывая сложность fio за дружелюбным интерфейсом.
Здесь есть готовые пресеты для разных сценариев — от последовательного чтения до случайных операций с мелкими файлами. Интересно, что программа умеет генерировать детальные отчёты в читаемом формате с показателями IOPS и задержек. Поддержка 20+ языков и сборка через Flatpak/Snap делают её доступной для большинства дистрибутивов Linux.
🤖 GitHub
@cpluspluc
Здесь есть готовые пресеты для разных сценариев — от последовательного чтения до случайных операций с мелкими файлами. Интересно, что программа умеет генерировать детальные отчёты в читаемом формате с показателями IOPS и задержек. Поддержка 20+ языков и сборка через Flatpak/Snap делают её доступной для большинства дистрибутивов Linux.
🤖 GitHub
@cpluspluc
This media is not supported in your browser
VIEW IN TELEGRAM
🚀 Разработчик показал движок на C, который работает в 14 раз быстрее Unity в браузере — и теперь доступна онлайн-демо.
Многие не поверили в заявленную разницу в производительности, поэтому он выложил демо в открытый доступ. Сравнение проводится с реальным Unity-проектом, выложенным на GitHub.
🛠️ C-движок демонстрирует:
• Существенно более высокую FPS в браузере
• Минимальную просадку при рендеринге
• Низкий overhead по сравнению с WebAssembly-сборкой Unity
💬 Автор пока не решил, выкладывать ли исходники C-версии — рассматривает вариант лицензии CC (non-commercial).
🔗 Демо: https://cgamedev.com/
🔗 Код: https://github.com/gabrieldechichi/unity_webglperftest
@cpluspluc
Многие не поверили в заявленную разницу в производительности, поэтому он выложил демо в открытый доступ. Сравнение проводится с реальным Unity-проектом, выложенным на GitHub.
🛠️ C-движок демонстрирует:
• Существенно более высокую FPS в браузере
• Минимальную просадку при рендеринге
• Низкий overhead по сравнению с WebAssembly-сборкой Unity
💬 Автор пока не решил, выкладывать ли исходники C-версии — рассматривает вариант лицензии CC (non-commercial).
🔗 Демо: https://cgamedev.com/
🔗 Код: https://github.com/gabrieldechichi/unity_webglperftest
@cpluspluc
This media is not supported in your browser
VIEW IN TELEGRAM
🛰️ ip-nose — геолокация IP в стиле «Матрицы» прямо в терминале
🔹 Определение вашего IP и локации в один клик
🔹 Информация: страна, город, провайдер, координаты
🔹 Цветной интерфейс с ASCII-анимацией
🔹 Сохраняет историю запросов
🔹 Поддержка кастомной конфигурации через
📦 Установка:
🚀 Запуск:
👁 Выводит ваш публичный IP, данные о местоположении и отображает их в терминале с визуальным оформлением.
📁 Пример данных:
• IP: 45.***.***.101
• Город: Paris
• Страна: France
• ISP: Orange
• Latitude / Longitude: 48.85 / 2.35
🎯 Подходит для:
• Пентестеров и сисадминов
• CLI-энтузиастов
• Тех, кто любит красивые утилиты в терминале
🔗 GitHub
✨ Лёгкий, эффектный и полезный инструмент для работы с IP прямо из терминала.
ip-nose
— это кроссплатформенный CLI-инструмент на C++ для определения геопозиции IP-адресов с эффектной визуализацией в стиле «Matrix». Работает на Linux и Termux.🔹 Определение вашего IP и локации в один клик
🔹 Информация: страна, город, провайдер, координаты
🔹 Цветной интерфейс с ASCII-анимацией
🔹 Сохраняет историю запросов
🔹 Поддержка кастомной конфигурации через
config.json
📦 Установка:
git clone https://github.com/Karim93160/ip-nose.git
cd ip-nose
make
sudo make install
🚀 Запуск:
ip-nose
👁 Выводит ваш публичный IP, данные о местоположении и отображает их в терминале с визуальным оформлением.
📁 Пример данных:
• IP: 45.***.***.101
• Город: Paris
• Страна: France
• ISP: Orange
• Latitude / Longitude: 48.85 / 2.35
🎯 Подходит для:
• Пентестеров и сисадминов
• CLI-энтузиастов
• Тех, кто любит красивые утилиты в терминале
🔗 GitHub
✨ Лёгкий, эффектный и полезный инструмент для работы с IP прямо из терминала.
Научный журнал конференции AI Journey 2025: гонка за миллионом и публикацией в авторитетном журнале началась!
Рассказать о своем исследовании миру, получить миллион и бонус к научной карьере!
В рамках международной конференции AI Journey запущен научный батл с призовым фондом 1 000 000 ₽ за лучшую работу в области искусственного интеллекта. Но это не просто конкурс!
Твоё исследование может попасть в спецвыпуск «Доклады Российской академии наук. Математика, информатика, процессы управления» и его англоязычной версии Doklady Mathematics.
Условия:
— Полная оригинальность — никакого рерайта чужих статей и переизбытка цитат
— Дедлайн — 20 августа (отсчёт уже идёт!)
— Языки: русский/английский
Узнать правила и подать статью на отбор -> AI Journey
Рассказать о своем исследовании миру, получить миллион и бонус к научной карьере!
В рамках международной конференции AI Journey запущен научный батл с призовым фондом 1 000 000 ₽ за лучшую работу в области искусственного интеллекта. Но это не просто конкурс!
Твоё исследование может попасть в спецвыпуск «Доклады Российской академии наук. Математика, информатика, процессы управления» и его англоязычной версии Doklady Mathematics.
Условия:
— Полная оригинальность — никакого рерайта чужих статей и переизбытка цитат
— Дедлайн — 20 августа (отсчёт уже идёт!)
— Языки: русский/английский
Узнать правила и подать статью на отбор -> AI Journey
🎮 Cemu — эмулятор Wii U, который оживляет забытые игры.
Этот проект предлагает современное решение для запуска классических тайтлов Nintendo вроде Mario Kart 8 или Breath of the Wild. При этом он не просто запускает игры Wii U — он делает это с поддержкой 4K, модами и улучшенной производительностью.
При этом эмулятор пытается сохранять простоту: portable-версия для Windows не требует установки, а сообщество активно создает графические моды. Хотя macOS-сборка пока экспериментальна, на Linux и Windows большинство игр работают почти идеально.
🤖 GitHub
@cpluspluc
Этот проект предлагает современное решение для запуска классических тайтлов Nintendo вроде Mario Kart 8 или Breath of the Wild. При этом он не просто запускает игры Wii U — он делает это с поддержкой 4K, модами и улучшенной производительностью.
При этом эмулятор пытается сохранять простоту: portable-версия для Windows не требует установки, а сообщество активно создает графические моды. Хотя macOS-сборка пока экспериментальна, на Linux и Windows большинство игр работают почти идеально.
🤖 GitHub
@cpluspluc
🧠 C++ Задача для продвинутых: загадка с `std::move` и `const`
❓ Задача: что выведет этот код и почему?
🔍 Варианты ответов:
• a)
• b)
• c) Ошибка компиляции
• d) Поведение зависит от компилятора
💡 Разбор:
Смотрим на перегрузки
•
•
👉 Вызовется вторая функция, с
✅ Ответ: b) const lvalue reference
🧠 Вывод:
📌 Совет: перед использованием
❓ Задача: что выведет этот код и почему?
#include <iostream>
#include <string>
#include <utility>
std::string identity(std::string&& s) {
std::cout << "rvalue reference\n";
return std::move(s);
}
std::string identity(const std::string& s) {
std::cout << "const lvalue reference\n";
return s;
}
int main() {
const std::string a = "hello";
std::string b = identity(std::move(a));
std::cout << "Result: " << b << std::endl;
}
🔍 Варианты ответов:
• a)
rvalue reference
• b)
const lvalue reference
• c) Ошибка компиляции
• d) Поведение зависит от компилятора
💡 Разбор:
a
объявлена как const std::string
. Даже после std::move(a)
она остаётся const
, потому что std::move
не снимает константность, он лишь преобразует к rvalue:
std::move(const std::string&) → const std::string&&
Смотрим на перегрузки
identity
:•
identity(std::string&&)
— принимает неконстантный rvalue •
identity(const std::string&)
— принимает константный lvalueconst std::string&&
не подходит к std::string&&
, потому что нельзя привязать rvalue-ссылку к `const`-объекту без соответствия типов.👉 Вызовется вторая функция, с
const std::string&
✅ Ответ: b) const lvalue reference
🧠 Вывод:
std::move
не делает объект мутабельным. Если объект const
, он остаётся const
, и rvalue-перегрузки не срабатывают.📌 Совет: перед использованием
std::move
всегда учитывайте `const`-квалификатор. Он может "сломать" ожидаемую семантику перемещения.🧠 Топ языков от евангелиста функционального программирования
Один из известных проповедников Haskell выложил свою субъективную классификацию языков программирования — от «святых граалей» до «цифровых окаменелостей».
Вот кратко по категориям:
Евангелист функционального программирования выложил свой рейтинг языков — и, как всегда, без компромиссов:
S: OCaml, C++
A: Haskell, Python, Rust, Kotlin
B: Scala, Go, Ruby, Swift, C#, TypeScript
C: PHP, Clojure, Java, C, Ассемблер
D: JavaScript, Bash
E: Fortran, Objective-C, COBOL, Perl
🍿 Комментарии уже взрываются — кто-то радуется за Kotlin в A, кто-то негодует за Java в C, кто-то вообще считает, что JS заслуживает отдельной категории «F».
А вот философский вопрос на подумать:
👉 Разработчики, которые всё ещё пишут на категории E — это уверенные мастера или уже цифровые археологи?
(Спойлер: COBOL-разработчики зарабатывают больше нас всех вместе взятых.)
#языкипрограммирования #fp #разработка #devюмор #tirlist
@cpluspluc
Один из известных проповедников Haskell выложил свою субъективную классификацию языков программирования — от «святых граалей» до «цифровых окаменелостей».
Вот кратко по категориям:
Евангелист функционального программирования выложил свой рейтинг языков — и, как всегда, без компромиссов:
S: OCaml, C++
A: Haskell, Python, Rust, Kotlin
B: Scala, Go, Ruby, Swift, C#, TypeScript
C: PHP, Clojure, Java, C, Ассемблер
D: JavaScript, Bash
E: Fortran, Objective-C, COBOL, Perl
🍿 Комментарии уже взрываются — кто-то радуется за Kotlin в A, кто-то негодует за Java в C, кто-то вообще считает, что JS заслуживает отдельной категории «F».
А вот философский вопрос на подумать:
👉 Разработчики, которые всё ещё пишут на категории E — это уверенные мастера или уже цифровые археологи?
(Спойлер: COBOL-разработчики зарабатывают больше нас всех вместе взятых.)
#языкипрограммирования #fp #разработка #devюмор #tirlist
@cpluspluc
⚡️ DOSBox Staging — современная эволюция легендарного эмулятора DOS с поддержкой новых технологий и активным развитием. Этот форк сохраняет совместимость с классической версией, но добавляет улучшенную обработку звука, поддержку современных кодеков и удобные функции вроде записи игрового процесса.
Проект использует SDL2, предлагает кроссплатформенные сборки для Windows, Linux и macOS, а также поддерживает динамическую загрузку библиотек вроде FluidSynth. Для разработчиков есть интеграция с Tracy Profiler и система CI.
🤖 GitHub
@cpluspluc
Проект использует SDL2, предлагает кроссплатформенные сборки для Windows, Linux и macOS, а также поддерживает динамическую загрузку библиотек вроде FluidSynth. Для разработчиков есть интеграция с Tracy Profiler и система CI.
🤖 GitHub
@cpluspluc
🚀 Хотите мониторить загрузку вашей NVIDIA GPU прямо из C++?
Вот минимальный пример на C++, который использует
🛠 Требования:
• Установленный драйвер NVIDIA и утилита
• C++17 или выше
📄 Код:
📦 Компиляция:
bash
Копировать
Редактировать
g++ gpu_monitor.cpp -o gpu_monitor -std=c++17
📌 Вывод:
🧠 Подходит для:
• Мониторинга GPU в реальном времени
• Интеграции в бэкенды, боты, системы логгинга
• Лёгкой отладки ML/AI-приложений на C++
Вот минимальный пример на C++, который использует
nvidia-smi
через системный вызов для получения текущей загрузки GPU и использованной памяти.🛠 Требования:
• Установленный драйвер NVIDIA и утилита
nvidia-smi
• C++17 или выше
📄 Код:
#include <iostream>
#include <cstdlib>
#include <memory>
#include <array>
void get_gpu_utilization() {
std::array<char, 128> buffer;
std::string result;
std::unique_ptr<FILE, decltype(&pclose)> pipe(
popen("nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv,nounits,noheader", "r"),
pclose
);
if (!pipe) {
std::cerr << "❌ Ошибка при вызове nvidia-smi" << std::endl;
return;
}
int gpu_id = 0;
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
std::string line(buffer.data());
size_t pos1 = line.find(',');
size_t pos2 = line.rfind(',');
std::string util = line.substr(0, pos1);
std::string mem_used = line.substr(pos1 + 1, pos2 - pos1 - 1);
std::string mem_total = line.substr(pos2 + 1);
std::cout << "🖥 GPU " << gpu_id++ << ": " << util << "% load | "
<< mem_used << " MiB / " << mem_total << " MiB";
}
}
int main() {
get_gpu_utilization();
return 0;
}
📦 Компиляция:
bash
Копировать
Редактировать
g++ gpu_monitor.cpp -o gpu_monitor -std=c++17
📌 Вывод:
🖥 GPU 0: 17% load | 512 MiB / 8192 MiB
🧠 Подходит для:
• Мониторинга GPU в реальном времени
• Интеграции в бэкенды, боты, системы логгинга
• Лёгкой отладки ML/AI-приложений на C++
Sane C++ Libraries — обновление за июнь 2025
🔧 Библиотека продолжает закрывать боль C++-разработчиков: теперь ещё больше асинхронщины и удобных обёрток без лишнего шаблонного ада.
Новое:
✅ Асинхронные операции с файлами и папками
-
-
✅ Асинхронный UDP:
-
✅ Улучшения в файловой системе:
-
- Убраны лишние зависимости от памяти
🔗 https://pagghiu.github.io/site/blog/2025-06-30-SaneCppLibrariesUpdate.html
🔗 https://github.com/Pagghiu/SaneCppLibraries/releases/tag/release%2F2025%2F06
@cpluspluc
🔧 Библиотека продолжает закрывать боль C++-разработчиков: теперь ещё больше асинхронщины и удобных обёрток без лишнего шаблонного ада.
Новое:
✅ Асинхронные операции с файлами и папками
-
copy/remove/rename {file|folder}
-
open/close/read/write file
✅ Асинхронный UDP:
-
SendTo
, ReceiveFrom
✅ Улучшения в файловой системе:
-
Iterator
, Watcher
- Убраны лишние зависимости от памяти
🔗 https://pagghiu.github.io/site/blog/2025-06-30-SaneCppLibrariesUpdate.html
🔗 https://github.com/Pagghiu/SaneCppLibraries/releases/tag/release%2F2025%2F06
@cpluspluc
📥 Palanteer — инструмент для глубокого анализа производительности C++ и Python-приложений. Этот проект предлагает детальную телеметрию: от временных меток выполнения функций до отслеживания потребления памяти и переключений контекста.
Инструмент обладает минималистичной интеграцией: в C++ достаточно подключить один заголовочный файл, а Python-код анализируется автоматически. Визуализация в реальном времени включает временные графики, flame graphs и логи с наносекундным разрешением.
🤖 GitHub
@cpluspluc
Инструмент обладает минималистичной интеграцией: в C++ достаточно подключить один заголовочный файл, а Python-код анализируется автоматически. Визуализация в реальном времени включает временные графики, flame graphs и логи с наносекундным разрешением.
🤖 GitHub
@cpluspluc
В Яндекс 360 мы создаём технологии, которые работают в основе более чем 13 сервисов, включая Диск, Почту, Телемост, Мессенджер и другие.
Открывайте Техножурнал, чтобы узнать:
— Как мы балансируем нагрузку в 300k RPS в Яндекс Мессенджере,
— Как подружили MongoDB и PostgreSQL в Диске,
— Какие в команде культура и ценности.
А ещё — как мы внедряли DDD, кто такой Technical Owner, как управляем 650+ шардами PostgreSQL и как подходим к проектированию архитектуры наших сервисов.
@yandex360team
Please open Telegram to view this post
VIEW IN TELEGRAM
🗄️ MyDumper — параллельный бэкап MySQL без головной боли. Этот инструмент делает логические дампы MySQL в 5-10 раз быстрее стандартного mysqldump за счёт многопоточной работы. Данные сохраняются в отдельных файлах для каждой таблицы, а встроенная поддержка регулярных выражений позволяет гибко выбирать, какие базы или таблицы включать в бэкап.
Разработчики интересно реализовали согласованность данных: инструмент сначала блокирует таблицы глобальным read-lock, затем создаёт транзакционные снимки для каждого потока и только потом отпускает блокировки. Для восстановления есть параллельный загрузчик myloader
🤖 GitHub
@cpluspluc
Разработчики интересно реализовали согласованность данных: инструмент сначала блокирует таблицы глобальным read-lock, затем создаёт транзакционные снимки для каждого потока и только потом отпускает блокировки. Для восстановления есть параллельный загрузчик myloader
🤖 GitHub
@cpluspluc
⚡️ Почему лучшие разработчики всегда на шаг впереди?
Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.
ИИ: www.tgoop.com/ai_machinelearning_big_data
Python: www.tgoop.com/pythonl
Linux: www.tgoop.com/linuxacademiya
Мл собес www.tgoop.com/machinelearning_interview
C++ www.tgoop.com/cpluspluc
Docker: www.tgoop.com/DevopsDocker
Хакинг: www.tgoop.com/linuxkalii
МЛ: www.tgoop.com/machinelearning_ru
Devops: www.tgoop.com/DevOPSitsec
Data Science: www.tgoop.com/data_analysis_ml
Javascript: www.tgoop.com/javascriptv
C#: www.tgoop.com/csharp_ci
Java: www.tgoop.com/java_library
Базы данных: www.tgoop.com/sqlhub
Python собеседования: www.tgoop.com/python_job_interview
Мобильная разработка: www.tgoop.com/mobdevelop
Golang: www.tgoop.com/Golang_google
React: www.tgoop.com/react_tg
Rust: www.tgoop.com/rust_code
ИИ: www.tgoop.com/vistehno
PHP: www.tgoop.com/phpshka
Android: www.tgoop.com/android_its
Frontend: www.tgoop.com/front
Big Data: www.tgoop.com/bigdatai
МАТЕМАТИКА: www.tgoop.com/data_math
Kubernets: www.tgoop.com/kubernetc
Разработка игр: https://www.tgoop.com/gamedev
Физика: www.tgoop.com/fizmat
SQL: www.tgoop.com/databases_tg
Папка Go разработчика: www.tgoop.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tgoop.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tgoop.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tgoop.com/addlist/mzMMG3RPZhY2M2Iy
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
😆ИТ-Мемы: www.tgoop.com/memes_prog
🇬🇧Английский: www.tgoop.com/english_forprogrammers
🧠ИИ: www.tgoop.com/vistehno
🖥 Chatgpt для кода в тг: @Chatgpturbobot
📕Ит-книги: https://www.tgoop.com/addlist/BkskQciUW_FhNjEy
💼ИТ-вакансии www.tgoop.com/addlist/_zyy_jQ_QUsyM2Vi
Подпишись, чтобы всегда знать, куда двигаться дальше!
Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.
ИИ: www.tgoop.com/ai_machinelearning_big_data
Python: www.tgoop.com/pythonl
Linux: www.tgoop.com/linuxacademiya
Мл собес www.tgoop.com/machinelearning_interview
C++ www.tgoop.com/cpluspluc
Docker: www.tgoop.com/DevopsDocker
Хакинг: www.tgoop.com/linuxkalii
МЛ: www.tgoop.com/machinelearning_ru
Devops: www.tgoop.com/DevOPSitsec
Data Science: www.tgoop.com/data_analysis_ml
Javascript: www.tgoop.com/javascriptv
C#: www.tgoop.com/csharp_ci
Java: www.tgoop.com/java_library
Базы данных: www.tgoop.com/sqlhub
Python собеседования: www.tgoop.com/python_job_interview
Мобильная разработка: www.tgoop.com/mobdevelop
Golang: www.tgoop.com/Golang_google
React: www.tgoop.com/react_tg
Rust: www.tgoop.com/rust_code
ИИ: www.tgoop.com/vistehno
PHP: www.tgoop.com/phpshka
Android: www.tgoop.com/android_its
Frontend: www.tgoop.com/front
Big Data: www.tgoop.com/bigdatai
МАТЕМАТИКА: www.tgoop.com/data_math
Kubernets: www.tgoop.com/kubernetc
Разработка игр: https://www.tgoop.com/gamedev
Физика: www.tgoop.com/fizmat
SQL: www.tgoop.com/databases_tg
Папка Go разработчика: www.tgoop.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tgoop.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tgoop.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tgoop.com/addlist/mzMMG3RPZhY2M2Iy
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
😆ИТ-Мемы: www.tgoop.com/memes_prog
🇬🇧Английский: www.tgoop.com/english_forprogrammers
🧠ИИ: www.tgoop.com/vistehno
📕Ит-книги: https://www.tgoop.com/addlist/BkskQciUW_FhNjEy
💼ИТ-вакансии www.tgoop.com/addlist/_zyy_jQ_QUsyM2Vi
Подпишись, чтобы всегда знать, куда двигаться дальше!
Please open Telegram to view this post
VIEW IN TELEGRAM
🎯 C++ Задача для опытных разработчиков: «Хитрый итератор»
У вас есть следующая структура:
Нужно реализовать итератор, который будет проходить по
- сначала возьмёт первый элемент,
- затем последний,
- затем второй,
- затем предпоследний,
- и так далее — «сжимая» список с двух концов.
🧠 *Вопрос:* Как бы вы реализовали такой итератор в стиле STL (`begin()` / `end()`), совместимый с range-based for?
🧩 Подсказка:
Нужно симулировать два указателя:
✅ Возможный подход:
Создаём кастомный класс
-
-
-
🔍 Пример:
📌 Использование:
📎 *Что здесь интересно:*
- Работа с нестандартной логикой обхода в рамках C++ STL-подобного интерфейса.
- Умение проектировать удобные и безопасные итераторы.
- Поддержка
🛠️ *Идея для расширения:* добавить
У вас есть следующая структура:
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--()
и реализовать двунаправленный итератор.