C++ Academy
16.5K subscribers
616 photos
127 videos
1 file
578 links
По всем вопросам- @haarrp

@itchannels_telegram - 🔥 best it channels

РКН: clck.ru/3FmxJF
Download Telegram
🎓 Комьюнити Cursor собрало огромную библиотеку гайдов и инструментов для вайбкодеров. Тут есть всё, чтобы работать с ИИ было проще и эффективнее:

— Готовые промты под разные задачи
— MCP-серверы для общения с внешними приложениями
— И самое крутое: генератор уникальных промт-правил под ваш проект

Налетай — всё это бесплатно и уже доступно.
🔗 https://cursor.directory/
🙉219👍5🔥2💊2😱1🥴1
📦 PcapPlusPlus — мощный C++ инструмент для работы с сетевыми пакетами. Этот мультиплатформенный проект предлагает удобные C++ обёртки для популярных движков захвата трафика — от классических libpcap/WinPcap до высокопроизводительных DPDK и PF_RING.

Библиотека поддерживает огромное количество протоколов: от базовых Ethernet и IP до специализированных вроде WireGuard или S7Comm. При работе с пакетами, помимо стандартного парсинга в проекте доступны функции сборки TCP-сессий с учётом ретрансмитов и обработки фрагментации IP. Для разработчиков приложений под Linux ценна интеграция с eBPF AF_XDP — это позволяет достичь линейной скорости обработки.

🤖 GitHub

@cpluspluc
10👍7🥰3
🧠 C++ Задача: "Живые итераторы"

У тебя есть вектор указателей на строки. Некоторые строки могут быть nullptr, а некоторые — валидные. Напиши функцию, которая:

1. Удаляет все nullptr из вектора.
2. Преобразует каждую строку в верхний регистр на месте.
3. Возвращает отсортированный вектор строк по длине (по убыванию).

✳️ Ограничение: нельзя копировать строки. Можно только перемещать (`std::move`).

Пример:


std::vector<std::string*> data = {
new std::string("apple"),
nullptr,
new std::string("banana"),
new std::string("kiwi"),
nullptr
};


После обработки ты должен получить std::vector<std::string> вида:


["BANANA", "APPLE", "KIWI"]


💡 Разбор
1) Удаляем nullptr с помощью std::erase_if или std::remove_if + erase.

2) Используем std::transform и std::toupper — с учётом, что строки по указателю.

3) Перемещаем строки в новый std::vector<std::string>, не копируя.

4) Сортируем с кастомным компаратором [](const std::string& a, const std::string& b) { return a.size() > b.size(); }.

Важно:

- Не забыть удалить указатели или использовать unique_ptr с std::move_if_noexcept.

- Верхний регистр через std::transform(s.begin(), s.end(), s.begin(), ::toupper).


📌 Попробуй сам — задача ловит на управлении памятью и семантике перемещения.

@cpluspluc
👍106🤔1
🔥 Совет дня: быстро посчитать частоты элементов в C++ с `std::unordered_map`

Когда нужно подсчитать, сколько раз каждый элемент встречается в векторе — не пиши вручную поиск. Просто используй unordered_map:


#include <iostream>
#include <vector>
#include <unordered_map>

int main() {
std::vector<std::string> items = {"apple", "banana", "apple", "orange", "banana", "apple"};
std::unordered_map<std::string, int> freq;

for (const auto& item : items) {
++freq[item];
}

for (const auto& [key, count] : freq) {
std::cout << key << ": " << count << "\n";
}
// 👉 apple: 3, banana: 2, orange: 1
}


📌 Удобно для:
— анализа строк
— парсинга логов
— простых хэш-агрегаций


@cpluspluc
18😴4🙈1🗿1
🧠 C++ Задача для продвинутых: безопасный счётчик с автоматическим сбросом

Условие:
Реализуйте потокобезопасный счётчик, который:
1. Увеличивается при вызове increment()
2. Возвращает текущее значение при get()
3. Автоматически сбрасывается в 0 через N миллисекунд после последнего increment()
4. Не сбрасывается, если за это время пришёл новый increment()

🔧 Условия:
- Нельзя использовать сторонние библиотеки (только стандарт C++17+)
- Нельзя вручную управлять потоками (используйте std::thread, std::mutex, `std::condition_variable`)
- Нужно обеспечить корректный RAII (автоматическое завершение потоков при разрушении объекта)

🔍 Пример:

SafeCounter counter(1000); // сброс через 1000 мс
counter.increment(); // value = 1
std::this_thread::sleep_for(500ms);
counter.increment(); // value = 2, таймер сброса перезапускается
std::this_thread::sleep_for(1500ms);
std::cout << counter.get(); // value = 0


💡 Подсказка:
Нужно реализовать "отложенный сброс", который перезапускается при каждом increment(). Используйте фоновый поток и condition_variable.

Ожидаемое решение (упрощённый скелет):

#include <iostream>
#include <thread>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <chrono>

class SafeCounter {
public:
SafeCounter(int timeout_ms) : timeout(timeout_ms), value(0), stop(false) {
worker = std::thread([this] { this->watch(); });
}

~SafeCounter() {
{
std::lock_guard<std::mutex> lock(mtx);
stop = true;
}
cv.notify_all();
worker.join();
}

void increment() {
{
std::lock_guard<std::mutex> lock(mtx);
++value;
last_action = std::chrono::steady_clock::now();
}
cv.notify_all();
}

int get() const {
return value.load();
}

private:
void watch() {
std::unique_lock<std::mutex> lock(mtx);
while (!stop) {
cv.wait_for(lock, timeout, [this] {
return stop || std::chrono::steady_clock::now() - last_action >= timeout;
});

if (stop) break;

if (std::chrono::steady_clock::now() - last_action >= timeout) {
value = 0;
}
}
}

std::chrono::milliseconds timeout;
std::chrono::steady_clock::time_point last_action = std::chrono::steady_clock::now();
std::atomic<int> value;
std::mutex mtx;
std::condition_variable cv;
std::thread worker;
bool stop;
};



🎯 Отличная задача, чтобы потренировать:

понимание RAII

работу с condition_variable

атомарные переменные

и правильную остановку фоновых потоков

Можешь доработать под конкретные кейсы — например, логирование событий сброса или работу с несколькими счётчиками.
17👍5🔥2
Когда впервые сталкиваешься с type_traits в C++, они кажутся чем-то из мира метапрограммирования для продвинутых Сеньоров.

Но чем глубже разбираешься в плюсах, тем чаще ловишь себя на мысли: «А как вообще этот кусок кода собирается?», «Почему одна перегрузка сработала, а другая нет?», «Как можно элегантно отфильтровать типы на этапе компиляции?»

И тут внезапно узнаешь, что именно type_traits — это та самая опора, с которой можно решать такие задачи красиво и без хаков. Особенно если писать универсальный код, библиотеки, или хочешь просто понимать, как работает стандартная библиотека.

Сегодня прочитал пост Вани Ходора, бэкенд-разработчика из Яндекс Лавки, который как раз сделал гайд по type_traits — не про то, *что* они делают, а за что их можно полюбить. Не учебник, не документация, а маленькое путешествие по любимым трейтам с примерами, идеями и попытками реализации.

Будет полезно, даже если вы давно знакомы с шаблонами — с другой стороны посмотрите на знакомые конструкции, а может, и вдохновитесь на свой маленький эксперимент в шаблонном коде.
❤‍🔥6🔥42🥰1🎉1
🧠 Продвинутая задача на C++ — Оптимальный доступ к матрице с кешированием

Задача:
У вас есть матрица N x M, хранящаяся в виде одномерного массива (row-major).
Нужно реализовать класс Matrix, поддерживающий:
- Быстрый доступ get(i, j) и set(i, j, value)
- Локальность данных при сканировании по строкам и по столбцам
- При этом: сравнить производительность строкового и столбцового прохода


int main() {
Matrix mat(10000, 10000);
// Заполнить матрицу числами
for (int i = 0; i < 10000; ++i)
for (int j = 0; j < 10000; ++j)
mat.set(i, j, i + j);

// Сумма по строкам
long long row_sum = 0;
for (int i = 0; i < 10000; ++i)
for (int j = 0; j < 10000; ++j)
row_sum += mat.get(i, j);

// Сумма по столбцам
long long col_sum = 0;
for (int j = 0; j < 10000; ++j)
for (int i = 0; i < 10000; ++i)
col_sum += mat.get(i, j);
}


Вопрос:
Почему сканирование по строкам быстрее, чем по столбцам, даже если данные одинаковые?

---

Разбор:


class Matrix {
private:
int rows, cols;
std::vector<int> data;

public:
Matrix(int r, int c) : rows(r), cols(c), data(r * c) {}

int get(int i, int j) const {
return data[i * cols + j];
}

void set(int i, int j, int value) {
data[i * cols + j] = value;
}
};


Ответ:
Память в C++ выделяется линейно.
В std::vector<int> data, элементы строки хранятся подряд в памяти.
То есть mat[0][0], mat[0][1], ..., mat[0][9999] идут подряд.

Когда мы сканируем по строкам, процессор использует кеш строк памяти эффективно.
Когда же мы сканируем по столбцам, мы прыгаем по памяти через cols шагов → кеш не успевает подгружать нужные блоки → больше cache misses → медленнее.

---

🧠 Вывод:
- Даже при правильном коде, порядок доступа к памяти критически важен
- Понимание устройства кеша CPU помогает писать реально быстрый код
- Такие задачи полезны для подготовки к системному программированию, оптимизации и собеседованиям

#cpp #performance #cache #memory #optimize
12🔥4👍1🥰1
📘 Шпаргалки по SQL — база и оконные функции в одном месте

Хочешь быстро освежить SQL или подготовиться к собеседованию?
Нашёл отличные PDF-шпаргалки, которые удобно сохранить себе и использовать как в работе, так и в учёбе.

🔹 Базовый SQL:
Каждая команда объясняется не только по синтаксису, но и по сути — когда и зачем использовать.

1️⃣ SELECT, WHERE, GROUP BY, HAVING
2️⃣ Все типы JOIN с примерами
3️⃣ CASE WHEN, UNION и подзапросы
4️⃣ Агрегатные функции и фильтрация

Основы SQL

🔹 Оконные функции (window functions):
Это уже продвинутый уровень, особенно полезный для аналитиков и дата-инженеров.

1️⃣ ROW_NUMBER, RANK, DENSE_RANK, NTILE
2️⃣ LAG, LEAD, FIRST_VALUE, LAST_VALUE
3️⃣ Работа с рамками окна: ROWS BETWEEN, RANGE, GROUPS
4️⃣ Сортировка внутри окна и реальные примеры запросов

🔗 Оконные функции в SQL

📌 Когда только начинал учить SQL, не хватало понятных материалов. А тут — всё чётко, наглядно и по делу. За это авторам — уважение 🙌

▶️ Сохраняйте себе, чтобы не потерять
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥43
💻 Amazon выпустила Kiro — новый ИИ-ассистент для разработчиков на базе VS Code. Компания создала собственный форк популярного редактора, дополнив его автономными нейросетевыми агентами. Они умеют не только проверять код в чате, но и самостоятельно исправлять ошибки, писать тесты и документацию.

Редактор обладает функцией Kiro Specs, позволяющей задавать ИИ конкретные задачи и получать отчеты об их выполнении. Пока сервис бесплатный, но Amazon уже анонсировал платные тарифы до $39 в месяц. Kiro встает в один ряд с Cursor и Windsurf, усиливая конкуренцию на рынке умных редакторов кода.

🔗 Ссылка - *клик*

@cpluspluc
14👍3🔥3😱2🙊1
Технологии, железо и роботы на Yandex Robotics Day уже 16 августа! 

На складах Маркета, Леманы Про, Перекрестка, Лавки и других компаний работают роботы Яндекса, которые помогают быстро сканировать товары, собирать посылки и перемещать заказы. Чтобы все функционировало быстро и точно, специалисты Яндекс Роботикс постоянно улучшают их. 

16 августа в Москве пройдет митап, на котором они расскажут, как именно это делают: 
— Серёжа Стариков выступит с докладом про коммуникационную платформу Yandex Robotics и ее применение в Yandex RMS
— Дима Мовчан объяснит, как команда создает умную роборуку с помощью imitation learning и RL
— Максим Пшибло расскажет, как с помощью Yandex Robotics Management System управлять несколькими роботами и какие алгоритмы необходимы этой системе

Кроме докладов в программе презентация нового робота, выставка тех, которые уже вовсю работают на складах, нетворкинг и неформальное афтепати с экспертами Яндекс Роботикс. 

Регистрируйтесь и зовите коллег!
🔧 cmake-init — генератор CMake-проектов, который избавляет от рутинной настройки. Этот инструмент создаёт готовую структуру с поддержкой FetchContent, разделением целей для разработчиков и пользователей, а также интегрирует современные практики CMake.

Проект особенно полезен тем, кто устал править шаблоны вручную: он сразу настраивает линтинг, тестирование и документацию через Doxygen. Поддерживает Conan и vcpkg, а также предлагает удобные пресеты для CLion и VSCode.

🤖 GitHub

@cpluspluc
8🔥7👍4
⚙️ Vulkan-Hpp — современные C++-биндинги для Vulkan API, разработанные Khronos Group. Этот заголовочный файл заменяет громоздкий C-интерфейс типобезопасными классами, шаблонами и RAII-обёртками, сохраняя нулевые накладные расходы.

У инструмента есть возможность выбора между исключениями и возвратом кодов ошибок через макросы. Для управления ресурсами доступны как unique-хэндлы, так и полноценные RAII-классы в пространстве имён vk::raii. Проект автоматически генерируется из спецификации Vulkan и предлагает:
— Нативные C++-конструкторы для структур Vulkan
— Безопасную работу с перечислениями и битовыми флагами
— Интеграцию с STL-контейнерами через ArrayProxy
— Поддержку цепочек структур через шаблон StructureChain

🤖 GitHub

@cpluspluc
11👍6🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
2 августа Яндекс проведет C++ Zero Cost Conf

Практикующие эксперты из Яндекса, VK, Ozon и других компаний выступят с докладами и представят реальные кейсы с измеримыми метриками.

Программа выступлений в Москве:

🔹Василий Рамаданов, старший инженер-программист Yadro, разберёт поведение std::simd на x86 и ARM;

🔹 Антон Полухин, руководитель группы разработки общих компонентов Техплатформы Городских сервисов Яндекса, расскажет, как использовать модули в больших существующих проектах с поддержкой старых стандартов;

🔹 Сергей Слотин, C++-эксперт и автор «Algorithms for Modern Hardware» выступит на тему «Performance Puzzlers»: будем изучать особенности работы процессоров и компиляторов.

Остальные доклады с разбивкой по городам — на сайте конференции.

Участников офлайна ждёт C++ код-гольф: решение задачи с минимальным числом символов. В Москве дополнительно пройдет воркшоп по непрерывному профилированию Perforator и Case Lab по надёжности микросервисов с решением задач.

Ивент пройдет в трёх городах — Москве, Белграде (онлайн/офлайн) и Санкт-Петербурге (только офлайн). Зарегистрироваться можно здесь
6🔥3🥰2
⛓️ CUDA Core Compute Libraries (CCCL) — единый репозиторий от NVIDIA, объединяющий три ключевые библиотеки для работы с CUDA: Thrust, CUB и libcudacxx. Проект упрощает разработку высокопроизводительных вычислений, предлагая переносимые абстракции для разных GPU-архитектур.

Библиотеки поддерживают атомарные операции через cuda::atomic_ref и интеграцию с CMake. CCCL можно использовать как с официальным CUDA Toolkit, так и отдельно через GitHub или Conda, что удобно для экспериментов с новыми функциями до их выхода в стабильных версиях CUDA.

🤖 GitHub

@cpluspluc
🔥11👍43🥰1🤔1