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

Автор: @energy_c

РКН: https://clck.ru/3QREHc

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
Сильная статья о том, как написать свой компилятор на C++ с использованием LLVM!

В этой статье:
• Как компилятор проходит путь от исходного кода до промежуточного представления
• Зачем нужны лексер, парсер, семантика и LLVM IR
• Как устроить ошибки, типы и генерацию кода в собственном языке

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


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75🔥4
Когда в C++ лучше использовать std::span?

Иногда функция должна работать с массивом, vector или частью данных, но владеть этими данными ей не нужно.

Часто в таком случае передают vector:
int sum(const std::vector<int>& values) {
int result = 0;

for (int value : values) {
result += value;
}

return result;
}


Проблема в том, что функция теперь привязана именно к std::vector.

Если у тебя есть обычный массив, придётся писать перегрузку или создавать vector:
int data[] = {1, 2, 3};

// sum(data) не подойдёт


В C++20 для таких случаев есть std::span:
int sum(std::span<const int> values) {
int result = 0;

for (int value : values) {
result += value;
}

return result;
}


Теперь функция принимает разные источники данных:
std::vector<int> a{1, 2, 3};
std::array<int, 3> b{4, 5, 6};
int c[] = {7, 8, 9};

sum(a);
sum(b);
sum(c);


Можно передать и часть диапазона:
sum(std::span(a).subspan(1, 2));


std::span не владеет памятью. Он просто смотрит на уже существующие данные.

Поэтому нельзя возвращать span на локальный массив:
std::span<int> bad() {
int values[] = {1, 2, 3};
return values;
}


После выхода из функции массив исчезнет, а span останется висячей ссылкой.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍155🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
👨‍💻 cppreference — информативный справочник по C и C++!

Полезный ресурс для разработчиков на C и C++. На сайте собрана подробная документация по языкам и стандартной библиотеке: типы данных, функции, классы, шаблоны, контейнеры, алгоритмы, работа с памятью, потоки, многопоточность и новые возможности стандартов C++11, C++14, C++17, C++20 и C++23.

📌 Оставляю ссылочку: cppreference.com

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍8🔥4
Крутая статья про то, как нарисовать мультяшный взрыв на чистом C++ примерно за 180 строк!

В этой статье:
• Как работает ray marching и численное пересечение луча с объектом
• Как добавить освещение, паттерн, displacement mapping и шум
• Как сохранить результат в PPM и получить готовую картинку без графических библиотек

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


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

Например, vector удобен для быстрого доступа по индексу, set хранит элементы в отсортированном виде, а priority_queue помогает быстро получать максимальный элемент.

На картинке основные контейнеры STL, частые операции, асимптотика, примеры использования sort, binary_search, lower_bound, upper_bound, min_element, max_element, pair, tuple и других полезных инструментов.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥4
Собираем небольшой LRU-кэш на C++!

Иногда нужно хранить только последние N значений: результаты дорогих вычислений, ответы локального кэша или недавно использованные настройки. Если лимит превышен, самый старый элемент должен автоматически удаляться.

Для порядка использования удобно взять std::list:
std::list<int> order;


А для быстрого поиска unordered_map:
std::unordered_map<int, std::list<int>::iterator> pos;


Добавим лимит:
const std::size_t limit = 3;


Когда ключ уже есть, переносим его в начало:
order.erase(pos[key]);
order.push_front(key);
pos[key] = order.begin();


Если ключ новый, просто добавляем его первым:
order.push_front(key);
pos[key] = order.begin();


Теперь проверяем размер кэша:
if (order.size() > limit) {
pos.erase(order.back());
order.pop_back();
}


Соберём это в функцию:
void touch(int key) {
if (pos.contains(key)) {
order.erase(pos[key]);
}

order.push_front(key);
pos[key] = order.begin();

if (order.size() > limit) {
pos.erase(order.back());
order.pop_back();
}
}


Проверим порядок:
touch(1);
touch(2);
touch(3);
touch(1);
touch(4);


Теперь внутри останутся 4, 1 и 3:
for (int x : order) {
std::cout << x << ' ';
}


Ожидаемый вывод:
4 1 3


LRU-кэш хорошо показывает, как std::list и unordered_map дополняют друг друга: список хранит порядок, а map даёт быстрый доступ к узлам.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥74😁2👍1
Делаем простой парсер CLI-флагов на C++!

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

В этой задаче:
• Храним аргументы в unordered_map;
• Разбираем значения через знак =;
• Поддерживаем флаги без значения.


Такой подход удобен для утилит и инструментов где не хочется подключать полноценный CLI-фреймворк.

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍6🔥2😁1
Интересная статья про попытку сделать игру на C++ через Raylib и лучше понять язык на практике!

В этой статье:
• Как Raylib помогает быстро начать с графикой, вводом и игровой логикой
• Почему C++ нельзя воспринимать как “Java с другим синтаксисом”
• Какие нюансы объектов, указателей и this всплывают уже в простом игровом коде

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


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍7🔥4
Разберём std::chrono: 7 вещей для нормальной работы со временем в C++!

В C++ не стоит хранить таймауты и задержки просто в int, потому что быстро теряется смысл числа: секунды это, миллисекунды или что-то ещё. std::chrono делает единицы измерения частью типа и помогает писать более читаемый код.

В этой шпоре:
• чем steady_clock отличается от system_clock;
• как хранить длительность через duration;
• как задавать миллисекунды и секунды;


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

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥177🤝6👍5
Шпаргалка по новым возможностям C++17!

Например, structured bindings позволяют удобно распаковывать пары и tuple, а if constexpr помогает выбирать ветку кода на этапе компиляции.
На картинке ключевые фичи C++17: class template argument deduction, fold expressions, constexpr lambda, inline variables, nested namespaces, structured bindings, initializers в if/switch, [[fallthrough]], [[nodiscard]], [[maybe_unused]] и другие изменения языка.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍85🔥3😁2
Считаем топ самых частых слов на C++!

Иногда нужно быстро понять, какие слова чаще всего встречаются в тексте: в логах, комментариях, поисковых запросах или простом анализаторе.

Сначала заведём счётчик:
std::unordered_map<std::string, int> freq;


Разобьём строку на слова:
std::istringstream in(text);
std::string word;

while (in >> word) {
++freq[word];
}


Теперь переложим пары в vector:
std::vector<std::pair<std::string, int>> items(
freq.begin(), freq.end()
);


Отсортируем по частоте:
std::sort(items.begin(), items.end(),
[](const auto& a, const auto& b) {
return a.second > b.second;
});


Выведем первые 3 слова:
for (std::size_t i = 0; i < std::min<std::size_t>(3, items.size()); ++i) {
std::cout << items[i].first << ": " << items[i].second << '\n';
}


Для строки:
std::string text = "cpp java cpp rust cpp java";


Ожидаемый результат:
cpp: 3
java: 2
rust: 1


Такой анализатор показывает связку, unordered_map считает частоты, а vector + sort помогает быстро получить топ значений.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍5🔥4
Делаем простой string pool на C++!

Если в программе много повторяющихся строк вроде ролей, статусов, тегов или категорий, их можно хранить в одном месте и переиспользовать. Для этого подойдёт небольшой пул строк на базе std::unordered_set.

В этой задаче:
• храним уникальные строки;
• добавляем значение через insert;
• возвращаем ссылку на сохранённую строку;


Такой приём помогает уменьшить лишние копии и сделать работу с повторяющимися строками аккуратнее.

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍5🔥3😁1