40 строк кода превращают JSON-расписание в работающий планировщик, который тихо запускает ваши скрипты вовремя.
Что важно знать:
• Один файл исходника;
• Любой POSIX-шёлл;
• Работает офлайн.
Расширяйте проект: добавьте дни недели, параллельный запуск и логирование, чтобы автоматизация стала гибче и надёжней.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤4👍3🤝1
В этой статье:
• Идея и подготовка турнира: цели, формат, инструменты и задачи.• Организация процесса: поиск участников и оформление презентаций• Проведение и итоги: отборочный и финальный этапы, выводы и будущее.🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤15🔥6👍4👎1
std::optional как альтернатива «магическим» значениям!
Иногда функции возвращают
C++ предлагает более безопасный способ —
Определим функцию find_index, возвращающую std::optional<size_t>
Используем эту функцию в main и обрабатываем результат
🔥
📣 C++ Ready | #практика
Иногда функции возвращают
-1, 0 или nullptr, чтобы указать «нет результата» — и вы потом годами отлавливаете баги, когда забыли проверить этот «волшебный» код.C++ предлагает более безопасный способ —
std::optional<T>. Вместо -1 или nullptr вы явно показываете, что результат может отсутствовать, и заставляете пользователей API проверять это.Определим функцию find_index, возвращающую std::optional<size_t>
std::optional<size_t> find_index(const std::vector<int>& v, int x) {
for (size_t i = 0; i < v.size(); ++i)
if (v[i] == x)
return i; // нашли — возвращаем индекс
return {}; // не нашли — пустой optional
}Используем эту функцию в main и обрабатываем результат
int main() {
std::vector<int> data = {10, 20, 30};
if (auto idx = find_index(data, 20)) {
std::cout << "Найдено в позиции " << *idx << "\n";
} else {
std::cout << "Элемент не найден\n";
}
}std::optional делает код самодокументируемым, избавляет от «магических» значений и принуждает явно обрабатывать отсутствие результата.Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤9🔥4
Используй
std::variant — безопасную и современную замену union, которая может хранить значения разных типов одновременно, но только одно за раз.В примере
get_value() возвращает либо int, либо std::string, а std::visit вызывает нужный обработчик в зависимости от типа.Полная безопасность типов на этапе компиляции, без
if-ов, switch-ей и dynamic_cast.Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥7❤5
Позволяют удобно извлекать значения из пары, кортежа или структуры без лишнего кода.
В этом посте:
• Упрощают доступ к частям сложных объектов;
• Работают с парами, кортежами и структурами;
• Удобны в циклах и функциях с множеством выходов.
Теперь можно забыть про .first, std::get и другие лишние обёртки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝14🔥7❤6
std::span решает эту боль: один лёгкий объект-вид на непрерывный участок памяти без копий и аллокаций.Что получает функция
print() из примера:• Унификация — принимает и std::vector, и std::array, и T[N], и пару указателей.
• Размер внутри — длина уже хранится в span, никаких size отдельно.
• Ноль оверхеда — только два слова (ptr + size) на стеке
span не владеет данными. Он «живёт» лишь пока жив исходный контейнер или массив.Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍6🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22❤4👍3🤝3
This media is not supported in your browser
VIEW IN TELEGRAM
Мини-гайды C++ Bites с примерами и упражнениями, e-book C++ Story (12 глав), глоссарий и ссылки на справочные материалы, флеш-карточки, а также индекс репозиториев с демо-кодом, проектами и «Bits»-сравнениями между языками
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥7❤4
Засекаем время выполнения кода!
Сейчас научимся измерять, сколько времени занимает выполнение части программы. Это пригодится при отладке, оптимизации и тестировании производительности.
Подключим нужные библиотеки — всё уже есть в стандартной библиотеке:
Засекаем время до и после выполнения нужного участка. Так мы сможем точно узнать, сколько он занял:
Вычисляем разницу во времени и красиво выводим результат в миллисекундах:
Возможный результат при запуске:
🔥 Таким образом ты можешь замерить, сколько времени уходит на любой участок кода: цикл, функцию, сортировку и т.д.
📣 C++ Ready | #практика
Сейчас научимся измерять, сколько времени занимает выполнение части программы. Это пригодится при отладке, оптимизации и тестировании производительности.
Подключим нужные библиотеки — всё уже есть в стандартной библиотеке:
#include <iostream>
#include <chrono>
Засекаем время до и после выполнения нужного участка. Так мы сможем точно узнать, сколько он занял:
auto start = std::chrono::high_resolution_clock::now();
// код, который измеряем
auto end = std::chrono::high_resolution_clock::now();
Вычисляем разницу во времени и красиво выводим результат в миллисекундах:
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "Время выполнения: " << ms.count() << " мс\n";
Возможный результат при запуске:
Время выполнения: 5 мс
🔥 Таким образом ты можешь замерить, сколько времени уходит на любой участок кода: цикл, функцию, сортировку и т.д.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍7❤6
Библиотека
spdlog превращает рутинные записи в лаконичные вызовы и сохраняет мощь гибкой настройки без сложных файлов и лишних аргументов.В ней есть:
• Легкий старт даже в большом проекте;
• Понятные отчеты сразу после запуска;
• Встроенная защита от задержек при запись.
Добавьте
spdlog и забудьте о долгой настройке логов.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥6👍5🤝1