C
C/C++ Ready | Программирование
18.09.2026 17:12 · 👁 2.6K
Почему setprecision не всегда означает количество знаков после точки?
В C++ для форматирования дробных чисел часто используют std::setprecision. На первый взгляд кажется, что он задаёт количество цифр после запятой.
Но без std::fixed это не так:
std::cout << std::setprecision(3) << 123.456;
Результат будет не 123.456 с тремя знаками после точки. Поток выведет три значащие цифры:
123
Если нужны знаки после точки, добавляют std::fixed:
std::cout << std::fixed << std::setprecision(3)
<< 123.456;
Теперь результат будет предсказуемым:
123.456
Для маленьких чисел разница ещё заметнее:
std::cout << std::setprecision(2) << 0.012345;
Без fixed поток снова считает значащие цифры и может перейти к компактной форме вывода.
std::setprecision сам по себе управляет точностью, а не обязательно количеством символов после точки.
📣 C++ Ready | #совет
C
C/C++ Ready | Программирование
18.09.2026 07:30 · 👁 2K
Собираем простой пул объектов на C++!
Иногда объект дорого создавать заново каждый раз. Например, буфер, парсер, контекст или структура с заранее выделенной памятью.
В этой задаче:
• храним свободные объекты
• выдаём готовый экземпляр
• возвращаем объект обратно
• очищаем состояние перед повторным использованием
Такой подход помогает снизить количество аллокаций и делает повторное использование ресурсов более явным.
📣 C++ Ready | #задача
C
C/C++ Ready | Программирование
17.09.2026 08:12 · 👁 2.7K
Пишем вывод последних строк файла на C++!
Иногда нужно быстро посмотреть конец лога или временного файла. Сделаем маленькую функцию, которая хранит только последние N строк и не загружает весь файл в память.
Для этого удобно использовать std::deque. Он позволяет добавлять строки в конец и удалять самые старые строки из начала.
Сначала подключим нужные заголовки:
#include <deque>
#include <fstream>
#include <iostream>
#include <string>
Теперь открываем файл и готовим контейнер:
std::ifstream in(path);
std::deque<std::string> tail;
std::string line;
При чтении добавляем новую строку в конец:
while (std::getline(in, line)) {
tail.push_back(line);
}
Если строк стало больше лимита, удаляем самую старую:
if (tail.size() > limit) {
tail.pop_front();
}
В итоге печатаем то, что осталось в deque:
for (const auto& row : tail) {
std::cout << row << '\n';
}
Такой подход работает потоково. Даже если лог большой, в памяти одновременно лежит только нужное количество последних строк.
📣 C++ Ready | #практика
C
C/C++ Ready | Программирование
15.09.2026 08:12 · 👁 3.2K
Шпаргалка по std::span в C++20!
Например, std::span позволяет передать часть vector, array или обычного C-массива без копирования и без владения памятью.
На картинке собраны основные сценарии std::span. Есть создание view на диапазон, size, size_bytes, front, back, data, first, last, subspan и важное предупреждение про lifetime исходного контейнера.
Сохрани, чтобы не потерять!
📣 C++ Ready | #ресурс
C
C/C++ Ready | Программирование
14.09.2026 08:12 · 👁 2.6K
Интересная статья про constexpr Game of Life на C++!
Автор разбирает необычный эксперимент, где логика игры считается ещё на этапе компиляции. Внутри есть consteval, constexpr, двумерный Canvas, генерация поколений и попытка достать результат без обычного запуска программы.
В статье автор показывает:
• как Game of Life можно представить как набор compile-time вычислений
• зачем нужен consteval и чем он строже обычного constexpr
• как искать результат работы программы в артефактах сборки
Продолжай читать на Habr
📣 C++ Ready | #статья
C
C/C++ Ready | Программирование
12.09.2026 12:10 · 👁 2.8K
Почему reserve() не добавляет элементы в vector?
reserve() часто используют перед заполнением vector:
std::vector<int> nums;
nums.reserve(10);
После этого у vector действительно появляется место под 10 элементов, но размер остаётся нулевым:
std::cout << nums.size() << '\n'; // 0
std::cout << nums.capacity() << '\n'; // 10
Важно не путать size и capacity.
Такой код ошибочный:
std::vector<int> nums;
nums.reserve(10);
nums[0] = 42; // undefined behavior
Индексатор работает только с уже существующими элементами. reserve() выделяет память, но не создаёт объекты внутри vector.
Если нужно добавить значения, используй push_back():
nums.push_back(42);
nums.push_back(100);
А если нужны именно 10 готовых элементов, нужен resize():
std::vector<int> nums;
nums.resize(10);
nums[0] = 42;
reserve() полезен, когда ты заранее знаешь примерное количество будущих элементов:
std::vector<std::string> logs;
logs.reserve(1000);
for (auto line : input) {
logs.push_back(line);
}
Так vector реже перевыделяет память при росте.
📣 C++ Ready | #совет
C
C/C++ Ready | Программирование
12.09.2026 07:12 · 👁 2.4K
👍 The Art of Developing in Modern C++ — практические задания по современному C++!
В репозитории собраны решения и упражнения из специализации «Основы разработки на современном C++» от МФТИ и Яндекса. Материал разбит по уровням сложности — от «Белого пояса» с базовыми конструкциями языка до более продвинутых заданий из «Жёлтого», «Красного» и «Коричневого поясов».
Оставляю ссылочку: GitHub 📱
📣 C++ Ready | #репозиторий
C
C/C++ Ready | Программирование
11.09.2026 06:12 · 👁 2.1K
Собираем простой парсер CLI-аргументов на C++!
Нужно разобрать аргументы командной строки. Сделаем маленький парсер для флагов и параметров вида --key=value.
В этой задаче:
• идём по argv
• отделяем флаги от значений
• сохраняем параметры в map
• проверяем наличие нужных опций
Такой парсер удобен для утилит, тестовых запусков и маленьких dev-инструментов.
📣 C++ Ready | #задача
C
C/C++ Ready | Программирование
09.09.2026 15:12 · 👁 2.9K
Парсим простой CSV без сторонних библиотек на C++!
Иногда нужно разобрать строку CSV из лога, экспорта или конфигурации. Если формат простой, можно обойтись стандартной библиотекой и аккуратно пройти строку посимвольно.
Возьмём строку:
std::string line = "id,\"hello, cpp\",active";
Главная сложность это запятая внутри кавычек. Её нельзя считать разделителем.
Заведём буфер и флаг:
std::string cell;
bool quoted = false;
Теперь проходим символы:
for (char ch : line) {
if (ch == '"') {
quoted = !quoted;
continue;
}
if (ch == ',' && !quoted) {
cells.push_back(cell);
cell.clear();
continue;
}
cell += ch;
}
После цикла не забываем добавить последнюю ячейку:
cells.push_back(cell);
Проверим результат:
for (const auto& value : cells) {
std::cout << '[' << value << "]\n";
}
Ожидаемый вывод:
[id]
[hello, cpp]
[active]
При парсинге текста важно учитывать контекст. Одна и та же запятая может быть разделителем или обычным символом внутри значения.
📣 C++ Ready | #практика
C
C/C++ Ready | Программирование
09.09.2026 07:12 · 👁 1.8K
Разбираем std::filesystem 7 функций для работы с файлами!
std::filesystem помогает работать с путями, директориями и файлами без ручной склейки строк и платформенных ifdef.
В этой шпоре: exists, is_regular_file, create_directories, directory_iterator, recursive_directory_iterator, copy_file и remove_all.
📣 C++ Ready | #шпора