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

@itchannels_telegram - 🔥 best it channels

РКН: clck.ru/3FmxJF
Download Telegram
⚡️ Почему лучшие разработчики всегда на шаг впереди?

Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.

ИИ: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Мл собес t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
МЛ: t.me/machinelearning_ru
Devops: t.me/DevOPSitsec
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_ci
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: https://t.me/gamedev
Физика: t.me/fizmat
SQL: t.me/databases_tg

Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno

🖥 Chatgpt для кода в тг: @Chatgpturbobot

📕Ит-книги: https://t.me/addlist/BkskQciUW_FhNjEy
💼ИТ-вакансии t.me/addlist/_zyy_jQ_QUsyM2Vi

Подпишись, чтобы всегда знать, куда двигаться дальше!
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🎯 C++ Задача для опытных разработчиков: «Хитрый итератор»

У вас есть следующая структура:


std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};


Нужно реализовать итератор, который будет проходить по data следующим образом:
- сначала возьмёт первый элемент,
- затем последний,
- затем второй,
- затем предпоследний,
- и так далее — «сжимая» список с двух концов.

🧠 *Вопрос:* Как бы вы реализовали такой итератор в стиле STL (`begin()` / `end()`), совместимый с range-based for?

🧩 Подсказка:
Нужно симулировать два указателя: left и right, с шагом +1 и -1 соответственно, и внутри итератора отслеживать, с какой стороны взять следующий элемент.

Возможный подход:

Создаём кастомный класс ZigZagIterator, внутри которого:
- operator++() переключает сторону (`left` / `right`),
- operator*() возвращает нужный элемент в текущем шаге,
- operator!=() сравнивает позиции указателей.

🔍 Пример:


class ZigZagIterator {
public:
ZigZagIterator(const std::vector<int>& vec, bool end = false)
: data(vec), left(0), right(vec.size() - 1), useLeft(true), done(end) {}

int operator*() const {
return useLeft ? data[left] : data[right];
}

ZigZagIterator& operator++() {
if (useLeft) ++left;
else --right;
if (left > right) done = true;
useLeft = !useLeft;
return *this;
}

bool operator!=(const ZigZagIterator& other) const {
return done != other.done;
}

private:
const std::vector<int>& data;
size_t left, right;
bool useLeft;
bool done;
};

class ZigZagRange {
public:
ZigZagRange(const std::vector<int>& vec) : data(vec) {}
ZigZagIterator begin() const { return ZigZagIterator(data); }
ZigZagIterator end() const { return ZigZagIterator(data, true); }

private:
const std::vector<int>& data;
};


📌 Использование:


for (int val : ZigZagRange(data)) {
std::cout << val << " ";
}
// Output: 1 10 2 9 3 8 4 7 5 6


📎 *Что здесь интересно:*
- Работа с нестандартной логикой обхода в рамках C++ STL-подобного интерфейса.
- Умение проектировать удобные и безопасные итераторы.
- Поддержка range-based for без копирования данных.

🛠️ *Идея для расширения:* добавить operator--() и реализовать двунаправленный итератор.
20👍7❤‍🔥4🔥1🥰1
🎓 Комьюнити Cursor собрало огромную библиотеку гайдов и инструментов для вайбкодеров. Тут есть всё, чтобы работать с ИИ было проще и эффективнее:

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

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

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

🤖 GitHub

@cpluspluc
11👍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
13🔥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
🔧 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 по надёжности микросервисов с решением задач.

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

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

🤖 GitHub

@cpluspluc
🔥14👍64🥰1🤔1
🗣️ TEN VAD — ультраточная система обнаружения речи в реальном времени

Это современная модель Voice Activity Detection (VAD), превосходящая по точности популярные решения вроде WebRTC VAD и Silero VAD.

Она стала частью фреймворка TEN Framework — платформы для создания мультимодальных голосовых агентов.

🔹 Что делает TEN VAD особенной:

📈 Точность на SOTA-уровне — протестирована на LibriSpeech, GigaSpeech, DNS Challenge
🕒 Минимальная задержка — точное определение начала и конца речи в реальном времени
🧩 Низкие требования к ресурсам — подходит даже для мобильных устройств
⚙️ Гибкая интеграция — поддержка C и Python, работает на Linux, Windows, macOS, Android и iOS
🔊 Оптимизирована для 16 кГц аудио, с шагами 10/16 мс

https://huggingface.co/TEN-framework/ten-vad

@cpluspluc
11👍5🔥3
Выходим из френдзоны с легкостью

@cpluspluc
😁75🔥166👍5🤣4🥱2