C/C++ Ready | Программирование
15.2K subscribers
1.45K photos
93 videos
716 links
Авторский канал по разработке на C и C++.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Cотрудничество: @energy_c

РКН: https://clck.ru/3QREHc
Download Telegram
7,2 млн рублей призового фонда и реальные задачи космической отрасли 🚀

В сентябре пройдет серия КосмоХакатонов для студентов, молодых ученых и специалистов.
Участникам предстоит за два дня разработать собственное решение, поработать с экспертами и представить проект жюри.

Участников ждут:
🛰 реальные задачи космической отрасли
👥 команды от 3 до 5 человек
💻 очный и онлайн-форматы
🧑‍💻 работа с экспертами и трекерами
🏆 финал в Москве

Первый КосмоХакатон стартует уже 4 сентября в Ростове-на-Дону.

Дальше серия продолжится в Красноярске, Нижнем Новгороде, Благовещенске и Санкт-Петербурге, а завершится финалом в Москве.

Участие бесплатное. Присоединиться могут студенты, аспиранты, молодые ученые и специалисты от 18 лет.
🔗 Зарегистрироваться: https://космохакатон.рф
👍1
Почему std::vector<bool> может вести себя странно?

На первый взгляд vector<bool> выглядит как обычный vector, только для логических значений. Кажется, что каждый элемент там настоящий bool.

Но у этого контейнера есть специальная оптимизация. Он может хранить значения битами, поэтому обращение к элементу возвращает не bool&, а proxy-объект.

Обычный код выглядит нормально:
std::vector<bool> flags = {true, false};

flags[1] = true;


Проблемы начинаются, когда хочется взять ссылку на элемент:
auto& item = flags[0];


Такой код может не сработать так, как ожидается, потому что flags[0] не является настоящей ссылкой на bool.

Даже auto может скрыть нюанс:
auto item = flags[0];
item = false;


Здесь item часто остаётся proxy-объектом, который связан с контейнером. Код читается как работа с копией, но на деле может менять исходный vector.

Если нужен обычный массив флагов без таких сюрпризов, часто проще взять другой тип:
std::vector<char> flags;
std::vector<uint8_t> mask;


А если важна компактная битовая упаковка, лучше явно показать намерение:
std::bitset<64> flags;


vector<bool> не запрещён, но его лучше не воспринимать как обычный vector<T>. Особенно в шаблонном коде, где ожидаются настоящие ссылки на элементы.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍8🔥4
Сильная статья про high performance на C++ для CPU!

Автор объясняет, как подходить к ускорению кода. Разбирается CPU, кеши, профилирование, бенчмарки, sanitizers и понимание узких мест.

В статье автор показывает:
• почему сначала нужно искать bottleneck
• как кэш CPU и доступ к памяти влияют на скорость
• зачем нужны бенчмарки, профилирование и санитайзеры

Продолжай читать на Habr


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍7🔥4
Шпаргалка по smart pointers в C++!

Например, std::unique_ptr показывает единственное владение объектом, std::shared_ptr разделяет владение через счётчик ссылок, а std::weak_ptr помогает наблюдать объект без продления его жизни.

На картинке собраны основные правила работы со smart pointers. Есть std::unique_ptr, std::shared_ptr, std::weak_ptr, make_unique, make_shared, custom deleters, lock, reset, get и важные нюансы владения.

Сохрани, чтобы не потерять!

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4🔥3
Собираем простой dispatcher команд на C++!

Иногда программа принимает строковую команду и должна вызвать нужное действие. Самый быстрый путь часто начинается с цепочки if.

Например, так легко получить длинный блок условий:
if (cmd == "build") build();
else if (cmd == "clean") clean();
else if (cmd == "status") status();


Когда команд становится больше, такой код сложнее расширять и тестировать. Удобнее явно завести таблицу команд.

Опишем тип обработчика:
using Handler = void (*)();


Теперь можно собрать словарь:
std::unordered_map commands{
{"build", build},
{"clean", clean},
{"status", status}
};


Вызов становится коротким и одинаковым для всех команд:
auto it = commands.find(cmd);

if (it != commands.end()) {
it->second();
}


Если команда не найдена, можно отдельно обработать ошибку:
if (it == commands.end()) {
std::cout << "unknown command\n";
return;
}


Такой dispatcher удобно использовать в CLI-утилитах, тестовых меню, админских командах и маленьких инструментах. Новая команда добавляется одной строкой в таблицу, а не ещё одной веткой в середине логики.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍4🔥3
Разбираем std::filesystem 7 функций для работы с файлами!

std::filesystem помогает работать с путями, директориями и файлами без ручной склейки строк и платформенных ifdef.

В этой шпоре: exists, is_regular_file, create_directories, directory_iterator, recursive_directory_iterator, copy_file и remove_all.

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍65
Парсим простой 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 | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🔥2
Собираем простой парсер CLI-аргументов на C++!

Нужно разобрать аргументы командной строки. Сделаем маленький парсер для флагов и параметров вида --key=value.

В этой задаче:
• идём по argv
• отделяем флаги от значений
• сохраняем параметры в map
• проверяем наличие нужных опций


Такой парсер удобен для утилит, тестовых запусков и маленьких dev-инструментов.

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
👍 The Art of Developing in Modern C++ — практические задания по современному C++!

В репозитории собраны решения и упражнения из специализации «Основы разработки на современном C++» от МФТИ и Яндекса. Материал разбит по уровням сложности — от «Белого пояса» с базовыми конструкциями языка до более продвинутых заданий из «Жёлтого», «Красного» и «Коричневого поясов».

Оставляю ссылочку: GitHub 📱

📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍107🔥5👎3
Почему 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 | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍4🔥2