Например,
fmt::print и fmt::format позволяют писать безопасное, читаемое и производительное форматирование без printf и перегруженных stringstream.На изображении собраны возможности
{fmt}: плейсхолдеры и именованные аргументы; форматирование целых и вещественных чисел; работа со строками, диапазонами и кортежами.Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25❤11👍6
Почему для класса часто нужен virtual destructor?
Если у класса есть virtual-функции, его часто используют полиморфно:
И вот здесь появляется опасность.
Если у Base нет virtual destructor, удаление объекта через Base* может не вызвать деструктор наследника корректно.
То есть ресурсы Task могут не освободиться.
Код на слайде выглядит почти нормально:
Но если этот класс предназначен для удаления через указатель на Base, деструктор должен быть virtual:
Это маленькая строчка, которая защищает от очень неприятных багов.
🔥 Если класс полиморфный и через него могут удалять наследников — добавь virtual destructor.
📣 C++ Ready | #совет
Если у класса есть virtual-функции, его часто используют полиморфно:
Base* task = new Task;
delete task;
И вот здесь появляется опасность.
Если у Base нет virtual destructor, удаление объекта через Base* может не вызвать деструктор наследника корректно.
То есть ресурсы Task могут не освободиться.
Код на слайде выглядит почти нормально:
struct Base {
virtual void run() = 0;
};Но если этот класс предназначен для удаления через указатель на Base, деструктор должен быть virtual:
struct Base {
virtual ~Base() = default;
virtual void run() = 0;
};Это маленькая строчка, которая защищает от очень неприятных багов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍9🔥5
Например,
.find() помогает быстро найти подстроку, .substr() — вырезать часть строки, а .replace() — заменить текст без лишней ручной работы.На картинке — полезные методы
std::string, работа с итераторами, конвертация строк в числа и обратно, а также базовые операции изменения строк. Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20❤5👍3
RAII для ресурсов: FILE* без утечек и fclose в каждом return
Классика в C/C++ — открыть файл и не забыть закрыть:
Проблема в том, что при ранних
В C++ это решается RAII: ресурс закрывается автоматически в деструкторе.
Проще всего — завернуть
Можно сделать маленький хелпер, чтобы было ещё чище:
🔥 RAII убирает “обязанность помнить” про
📣 C++ Ready | #практика
Классика в C/C++ — открыть файл и не забыть закрыть:
FILE* f = std::fopen(path, "rb");
if (!f) return;
do_work(f);
if (something_bad()) {
std::fclose(f); // легко забыть
return;
}
std::fclose(f);
Проблема в том, что при ранних
return, исключениях или новых ветках кода fclose легко потерять — и получить утечку ресурса.В C++ это решается RAII: ресурс закрывается автоматически в деструкторе.
Проще всего — завернуть
FILE* в std::unique_ptr с кастомным deleter’ом:using FilePtr = std::unique_ptr<FILE, decltype(&std::fclose)>;
FilePtr f(std::fopen(path, "rb"), &std::fclose);
if (!f) return;
do_work(f.get());
if (something_bad()) {
return; // fclose вызовется сам
}
Можно сделать маленький хелпер, чтобы было ещё чище:
FilePtr open_file(const char* path, const char* mode) {
return FilePtr(std::fopen(path, mode), &std::fclose);
}
auto f = open_file(path, "rb");
if (!f) return;close/fclose/free — ресурс закрывается гарантированно при любом выходе из функции, а код становится короче и надёжнее.Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4🔥4😁1
This media is not supported in your browser
VIEW IN TELEGRAM
На сайте ты найдёшь короткие уроки и практические упражнения с мгновенной проверкой: от Hello, World, переменных и функций до тем вроде указателей, массивов, linked lists и базового OOP.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤6👍3
Иногда нужно заменить значение, но при этом не потерять то, что было раньше.
std::exchange как раз делает это без лишнего кода: возвращает старое значение и сразу записывает новое.Что важно знать:
• Удобен, когда нужно обновить состояние и сохранить предыдущее
• Хорошо подходит для флагов, reset-логики и простых state-переходов
• Делает намерение понятнее, чем ручное “сохранили старое, потом присвоили новое”
Небольшая функция из
<utility>, которая часто помогает убрать пару лишних строк и сделать код аккуратнее.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥11👍5🤝2
Concurrency - это про структуру программы: несколько задач могут продвигаться вперёд в перекрывающиеся промежутки времени. Parallelism - это уже физическое одновременное выполнение, например на нескольких ядрах CPU.
На картинке — визуальное отличие concurrent execution от parallel execution. Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18👍7🔥4🤝2
Например,
ranges::binary_search помогает быстро проверить наличие элемента в отсортированном диапазоне, а ranges::lower_bound и ranges::upper_bound — находить границы вставки или диапазон одинаковых значений.На картинке — алгоритмы бинарного поиска из
std::ranges, которые стоит держать под рукой при работе с контейнерами и алгоритмами STL.Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍6❤4👎1
Проверяем, что строка — целиком число (без “42abc → 42”)
Сейчас научимся превращать строку в
Допустим, пришла строка с хвостом:
Если
А чтобы программа не падала на ошибках, добавим
Проверяем “хвост” и печатаем результат:
Ловим два типичных случая ошибок:
Возможный результат (для
🔥 Так ты гарантируешь, что строка — строго число, без “42 и хвостик в придачу”.
📣 C++ Ready | #практика
Сейчас научимся превращать строку в
int так, чтобы не принимать мусор вроде "42abc". Это будет полезно для CLI, конфигов и пользовательского ввода.Допустим, пришла строка с хвостом:
std::string raw = "42abc";
std::stoi может распарсить только начало и вернуть 42. Поэтому берём pos — позицию, где парсинг остановился:size_t pos = 0;
int value = std::stoi(raw, &pos);
Если
pos не дошёл до конца строки — значит в конце есть лишние символы:if (pos != raw.size()) {
std::cout << "Некорректный ввод: лишние символы\n";
}А чтобы программа не падала на ошибках, добавим
try-catch:try {
size_t pos = 0;
int value = std::stoi(raw, &pos);Проверяем “хвост” и печатаем результат:
if (pos != raw.size()) { std::cout << "Лишние символы\n"; return 0; }
std::cout << "Число: " << value << '\n';Ловим два типичных случая ошибок:
} catch (const std::invalid_argument&) {
std::cout << "Некорректный ввод: не число\n";
} catch (const std::out_of_range&) {
std::cout << "Число вне диапазона int\n";
}Возможный результат (для
"42abc"):Лишние символы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍7❤4👎2
This media is not supported in your browser
VIEW IN TELEGRAM
Сервис для визуализации идей, архитектуры и рабочих процессов. В Whimsical можно создавать mind map, заметки и диаграммы, а встроенный AI помогает автоматически генерировать схемы и структурировать информацию по текстовому запросу. Удобно продумывать архитектуру проектов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤3👍2
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥8❤4