cpluspluc | Unsorted

Telegram-канал cpluspluc - C++ Academy

16151

По всем вопросам- @haarrp @itchannels_telegram - 🔥 best it channels РКН: clck.ru/3FmxJF

Subscribe to a channel

C++ Academy

💡 Хотите перейти от копирования чужих схем к созданию своих устройств?

Старт курса 24 апреля, но вы еще успеваете присоединиться к группе до 12 мая. Промокод на скидку Electronics_5 до 12.05.25

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

👍 Программа разработана практикующими инженерами, включает симуляторы, живые лекции и практику на каждом этапе. Вы научитесь работать с Arduino, цифровыми и аналоговыми схемами, узнаете, как подобрать питание, спроектировать корпус и подготовить документацию для производства.

➡️ Получите скидку на обучение. Оставьте заявку прямо сейчас: https://otus.pw/0roB/

Курс так же доступен в рассрочку!

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ", ИНН: 9705100963

Читать полностью…

C++ Academy

🦾 Задача с подвохом: Виртуальные функции и конструкторы

Условие:

Что выведет следующий код и почему?


#include <iostream>

class Base {
public:
Base() {
std::cout << "Base constructor\n";
foo();
}
virtual void foo() {
std::cout << "Base foo\n";
}
};

class Derived : public Base {
public:
Derived() {
std::cout << "Derived constructor\n";
}
void foo() override {
std::cout << "Derived foo\n";
}
};

int main() {
Derived d;
return 0;
}


Вопрос:
Что будет выведено? Почему результат может удивить даже опытных C++ разработчиков?

🔍 Разбор:

1️⃣ Мы создаём объект
Derived d;.
Это вызывает конструктор
Derived, но сначала выполняется конструктор `Base` (по правилам иерархии).

2️⃣ В конструкторе
Base есть вызов foo();.
Может показаться, что поскольку объект на самом деле
Derived, вызовется Derived::foo().

Но! Вот главный подвох:

➡️ В C++, когда вы вызываете виртуальную функцию из конструктора (или деструктора), она не виртуальна для объекта, который ещё не полностью сконструирован.

На момент вызова
foo() объект всё ещё только Base, потому что Derived ещё не инициализирован.

Пошаговое выполнение:

- Вызов конструктора
Base:
```
Base constructor
```
- Вызов
foo() внутри конструктора Base:
Это вызовет Base::foo(), а не
Derived::foo():
```
Base foo
```
- После завершения конструктора
Base, вызывается конструктор Derived:
```
Derived constructor
```

Итоговый вывод:

```
Base constructor
Base foo
Derived constructor
```

💥 Подвох:

• Многие ожидают, что виртуальные функции работают «магически» всегда.
• Но при вызове из конструктора (или деструктора) виртуальные функции не полиморфны, потому что объект ещё не «стал» Derived полностью.

🛡️ Что нужно помнить:

Никогда не полагайтесь на вызовы виртуальных функций в конструкторах/деструкторах для вызова методов производных классов. Это источник трудноуловимых багов.

Вывод:

C++ строго следует правилам объектной модели: пока объект конструируется (или разрушается), он считается экземпляром того класса, конструктор которого выполняется в данный момент. Это поведение важно помнить при проектировании иерархий классов!


@cpluspluc

Читать полностью…

C++ Academy

🎯 ▪ Задача: "Числа-близнецы с кастомным компаратором" (C++ для продвинутых)

У вас есть массив N целых чисел. Нужно найти все пары чисел (A, B), таких что:

1. |A - B| минимально среди всех пар в массиве
2. Aчетное, а Bнечетное
3. Если таких пар несколько, вернуть все, отсортированные по A, затем по B

Ограничения:
- 1 <= N <= 10^5
- -10^9 <= A[i] <= 10^9

Пример:

Вход:


arr = [4, 7, 9, 2, 8, 3]


Вывод:


(2,3)
(4,3)
(4,7)
(8,7)
(8,9)


✅ Минимальная разница = 1

🧠 Уловки задачи:

Наивное сравнение O(N²) слишком медленно

Нужно использовать сортировку + два указателя или бинарный поиск

✍️ Решение:

Идея решения — сначала разделить все числа на четные и нечетные, отсортировать их, а затем с помощью двух указателей найти пары с минимальной разницей. После этого собрать все такие пары и отсортировать результат по условию.

▪ Код:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int main() {
int N;
cin >> N;
vector<int> even, odd;

for (int i = 0; i < N; ++i) {
int x;
cin >> x;
if (x % 2 == 0) even.push_back(x);
else odd.push_back(x);
}

sort(even.begin(), even.end());
sort(odd.begin(), odd.end());

vector<pair<int, int>> result;
int min_diff = INT_MAX;

int i = 0, j = 0;
while (i < even.size() && j < odd.size()) {
int a = even[i];
int b = odd[j];
int diff = abs(a - b);

if (diff < min_diff) {
min_diff = diff;
result.clear();
result.emplace_back(a, b);
} else if (diff == min_diff) {
result.emplace_back(a, b);
}

if (a < b) i++;
else j++;
}

sort(result.begin(), result.end());

for (auto& p : result) {
cout << "(" << p.first << "," << p.second << ")\n";
}

return 0;
}```

▪ 🔍 Пошаговый разбор:

✅ Считываем входные данные

✅ Разделяем числа на четные и нечетные

✅ Сортируем оба массива

✅ Используем два указателя, чтобы найти минимальную разницу за O(N)

✅ Если нашли пару с меньшей разницей — сбрасываем результат и добавляем её

✅ Если нашли пару с такой же разницей — просто добавляем

✅ Финально сортируем все найденные пары по A, затем по B

✨ Почему задача хитрая: ✅ Нужно оптимальное решение вместо лобового перебора
✅ Включает тонкую работу с индексами
✅ Требует правильно обрабатывать несколько минимальных пар
✅ Объединяет знания сортировки, двух указателей и поиска пар

💪 Challenge для профи: 👉 Попробуйте реализовать эту задачу с помощью multiset + lower_bound / upper_bound, чтобы избежать сортировки массивов и упростить логику поиска ближайших чисел.

Читать полностью…

C++ Academy

🔧 OpenXRay движок STALKER с открытым исходным кодом получает вторую жизнь.

Сообщество энтузиастов серии STALKER продолжает развивать OpenXRay — улучшенную версию оригинального движка X-Ray Engine. Проект не просто исправляет баги и добавляет 64-битную поддержку, но и открывает новые возможности для модификации игр.

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

🤖 GitHub

@cpluspluc

Читать полностью…

C++ Academy

Лайфхаки визуального сторителлинга 😉

Рассказываем, почему это полезно и как его построить, чтобы было понятно всем: и менеджерам, и разработчикам, и дизайнерам

И да, вы справитесь, даже если не умеете рисовать! Александр Зинченко, СТО Яндекс 360, поделился инструментами для быстрых и удобных скетчей. А ещё рассказал про сложности передачи идей в проектных командах, которые можно решить с помощью визуального сторителлинга 😎

Больше интересной и полезной информации в канале от команды Яндекс 360

Читать полностью…

C++ Academy

🧑🏻‍💻Хотите научиться писать нейросети на одном из самых быстрых и безопасных языков программирования? 

На открытом уроке 6 мая в 20:00 МСК мы научим вас создавать простейшую нейросеть с нуля, используя минимальные библиотеки. Вы не только познакомитесь с Rust, но и узнаете, как оптимизировать вычисления для работы с нейронными сетями.

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

👉Присоединяйтесь к открытому уроку и получите скидку на программу обучения «Rust Developer. Basic»: https://otus.pw/417k/?erid=2W5zFFxssur 

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C++ Academy

⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:

Python: t.me/pythonl
Linux: t.me/linuxacademiya
Собеседования DS: t.me/machinelearning_interview
Нерйросети t.me/ai_machinelearning_big_data
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Devops: t.me/DevOPSitsec
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_ci
Java: t.me/javatg
Базы данных: 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
Разработка игр: /channel/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat

💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: /channel/addlist/mzMMG3RPZhY2M2Iy

😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy

Читать полностью…

C++ Academy

🧑‍💻 frugally-deep — легковесная библиотека, позволяющая использовать обученные модели без зависимости от TensorFlow, что особенно ценно для embedded-систем и проектов с ограниченными ресурсами.

Рабочий процесс выглядит просто: после обучения модели в Keras её можно конвертировать в специальный JSON-формат и загрузить в C++-приложение. При этом frugally-deep автоматически проверяет корректность конвертации, сравнивая результаты предсказаний с оригиналом.
Библиотека поддерживает даже сложные графы вычислений, созданные через functional API.

🤖 GitHub

@cpluspluc

Читать полностью…

C++ Academy

Примите участие в исследовании и выиграйте iPhone 16 Pro Max

Online Market Intelligence (OMI) проводит опрос среди IT-специалистов и студентов о текущем использовании платформ разработки и ИИ-ассистентов.

Исследование направлено на выяснение влияния ИИ на рынок труда и его роль в процессах разработки. Участвуя, вы можете помочь нам в этих вопросах и получить шанс выиграть iPhone 16 Pro Max.

Ссылка на опрос — здесь*

*Принимая участие в опросе Вы становитесь участником розыгрыша под наименованием «Если ты работаешь в IT, пройди опрос и выиграй iPhone 16 Рro Мax». Информация об организаторе розыгрыша, сроках проведения, правилах проведения розыгрыша, количестве призов, сроках, месте, порядке получения призов размещена по ссылке

Читать полностью…

C++ Academy

🧑🏻‍💻Как эффективно управлять ошибками в коде и избегать багов?

На открытом вебинаре 23 апреля в 20:00 МСК вы познакомитесь с мощной системой обработки ошибок в Rust и узнаете, почему этот подход считается одним из самых безопасных и надёжных. Вместе с экспертом вы освоите оператор «?» и работу с типами Result и Option.

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

👉Регистрируйтесь на вебинар и получите специальную скидку на полный курс «Rust Developer. Basic»: https://otus.pw/stgNn/?erid=2W5zFJ7QW6t 

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C++ Academy

🖥 less_slow.cpp — это образовательный репозиторий, который демонстрирует практики написания высокоэффективного кода на C++, C, CUDA, PTX и ассемблере.

Цель проекта — помочь разработчикам развить интуицию и мышление, ориентированные на производительность.​

🔍 Основные темы проекта:
- Микробенчмарки: Измерение производительности базовых операций, таких как сложение целых чисел, с использованием различных подходов, включая inline-ассемблер.

- Параллелизм и сложность вычислений: Анализ производительности стандартных алгоритмов сортировки и их оптимизация с использованием различных техник.

- Рекурсия: Сравнение рекурсивных и итеративных реализаций алгоритмов, таких как QuickSort, с акцентом на производительность и использование стека.

- Оптимизация стандартных функций: Примеры ускорения стандартных функций, таких как std::sin, с использованием приближений и SIMD-инструкций.

- Работа с JSON: Эффективный парсинг JSON без лишних аллокаций памяти, использование альтернатив стандартным библиотекам.​
GitHub
Hacker News

🛠️ Инструменты и технологии:
- Использование C++20 и современных компиляторов (GCC, Clang) для демонстрации новых возможностей языка.

- Интеграция с Google Benchmark для проведения точных измерений производительности.

- Примеры кода на CUDA, PTX и ассемблере для демонстрации низкоуровневой оптимизации.

- Использование сторонних библиотек, таких как fmt, range-v3, libunifex, cppcoro, liburing, oneTBB, ASIO, CUTLASS, CTRE, yyjson, Abseil, StringZilla и другие, для расширения функциональности и повышения производительности.​

📚 Дополнительные ресурсы:
Проект является частью серии "Less Slow", которая также включает реализации на Rust и Python.

Блог автора содержит подробные статьи по темам, затронутым в проекте: ashvardanian.com/tags/less-slow.​

Если вы хотите глубже понять, как писать эффективный код и избегать распространённых ошибок, less_slow.cpp станет отличным практическим пособием.

Github
Rust
Python.


@cpluspluc

Читать полностью…

C++ Academy

⚡️Хотите стать востребованным разработчиком и освоить один из самых перспективных языков программирования?

Курс «Rust Developer. Basic» от OTUS создан для тех, кто уже знаком с программированием и хочет уверенно развиваться в современной разработке. Rust гарантирует безопасность, высокую производительность и востребован в веб-разработке, блокчейне, анализе данных и даже в создании встроенных систем.

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

👉Оставьте заявку прямо сейчас и получите скидку на обучение: https://otus.pw/5MYd/?erid=2W5zFGhrBA8 

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C++ Academy

🔓Что выведет следующий код?


#include <iostream>
using namespace std;

class Base {
public:
Base() {
cout << "Base constructor: ";
call();
}
virtual void call() { cout << "Base::call\n"; }
};

class Derived : public Base {
int x = init();

int init() {
cout << "Derived::init\n";
return 42;
}

public:
Derived() {
cout << "Derived constructor\n";
}

void call() override {
cout << "Derived::call, x = " << x << "\n";
}
};

int main() {
Derived d;
return 0;
}


🔢Варианты ответа:

A)

Derived::init
Derived constructor


B)

Derived::init
Derived constructor


C)

Base constructor: Derived::call, x = 42
Derived constructor


D)

Derived::call, x = <undefined>
Derived::init
Derived constructor


Правильный ответ: B

💡Почему?
В момент вызова конструктора Base, объект ещё не стал Derived. Виртуальная функция вызывается в контексте Base.

Читать полностью…

C++ Academy

📖 asmbook — мягкое введение в программирование на ассемблере для ARM. Для разработчиков, пишущих на C/C++, но желающих разобраться в низкоуровневых особенностях процессоров, проект предлагает практическое руководство по ассемблеру ARMv8.

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

🔗 GitHub

@cpluspluc

Читать полностью…

C++ Academy

❓ Что выведет этот код? (C++23)


import std;

constexpr auto make_checker() {
return [](int x) consteval {
return x % 3 == 0 || x % 5 == 0;
};
}

int main() {
auto checker = make_checker();

std::vector numbers{1, 3, 5, 9, 10, 14, 15};

auto filtered = numbers | std::views::filter([&](int x) {
if (std::is_constant_evaluated()) {
std::print("constexpr\n");
}
return checker(x);
});

std::print("Filtered numbers: ");
for (int x : filtered) {
std::print("{} ", x);
}

std::println("");
}


🧠 Подсказка:
consteval делает checker доступным только в compile-time, но мы вызываем его в runtime через лямбду — что произойдёт?

std::is_constant_evaluated() — интересный механизм проверки, вызывается ли код во время компиляции.

Как отреагирует компилятор на попытку вызвать consteval функцию в runtime?


📌 Ответ
Этот код на C++23 не скомпилируется, и что именно здесь происходит.

🔍 Напоминаем ключевой фрагмент кода:

```cpp
constexpr auto make_checker() {
return [](int x) consteval {
return x % 3 == 0 || x % 5 == 0;
};
} ```

- Здесь создаётся лямбда-функция, помеченная как consteval.

- Ключевое слово consteval означает: функция обязана быть вызвана во время компиляции.

🧨 Где ошибка?


auto filtered = numbers | std::views::filter([&](int x) {
return checker(x); // ← ошибка тут
});


checker — это consteval-лямбда.

Но ты вызываешь её внутри лямбды, которая будет работать во время выполнения программы — т.е. в runtime.

Это нарушение правила consteval → нельзя вызывать такие функции в runtime-коде.

❌ Что скажет компилятор?
Компилятор выдаст ошибку компиляции, такую или похожую:

error: call to consteval function '<lambda>(int)' is not a constant expression



📘 Объяснение
consteval ≠ constexpr

constexpr — это могут быть вызваны в runtime, если нужно.

consteval — это всегда и только compile-time.

Когда ты вызываешь checker(x) в main(), ты нарушаешь это правило.

✅ Как можно исправить?
Если ты заменишь consteval на constexpr, код скомпилируется и выполнится:


constexpr auto make_checker() {
return [](int x) constexpr {
return x % 3 == 0 || x % 5 == 0;
};
}

И тогда результат будет:

Filtered numbers: 3 5 9 10 15

Потому что:
- 3 делится на 3
- 5 делится на 5
- 9 делится на 3
- 10 делится на 5
- 15 делится на 3 и 5

Читать полностью…

C++ Academy

💥 CLion теперь бесплатен для некоммерческих проектов! 😮

CLion — мощная IDE для разработки на C и C++, стала доступна бесплатно для:

• студентов и всех, кто изучает программирование
• разработчиков open source-проектов
• создателей обучающего и технического контента

Отличная возможность работать в профессиональной среде без затрат 💻

👉 Официальная шпаргалка по горячим клавишам для CLion: https://resources.jetbrains.com/storage/products/clion/docs/CLion_reference_card_all.pdf


@cpluspluc

Читать полностью…

C++ Academy

🖥 Эта статья рассказывает о подходах к бенчмаркингу при тестировании C++ кода!

🌟 Автор делится методами, как проводить точные и надежные бенчмарки, используя высокоточные таймеры и разделяя бенчмарки на разные исполнимые файлы для минимизации ошибок. В статье также рассматриваются проблемы и трудности, с которыми можно столкнуться при измерении производительности, и даются рекомендации по улучшению точности результатов.

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

@cpluspluc

Читать полностью…

C++ Academy

МТС приглашает разработчиков на масштабную ИТ-конференцию True Tech Day 6 июня. Участие бесплатно

Ключевая тема конференции в этом году — искусственный интеллект. Тебя ждут доклады ученых, выступления зарубежных спикеров по AI и экспертов крупных ИТ-компаний.

В программе:
— 4 трека и больше 40 докладов.
— Выступления зарубежных спикеров с индексом Хирша более 50.
— Концентрация практических кейсов: как создаются большие ML-проекты.
— Доклады по архитектуре, бэкенд-разработке и построению ИТ-платформ.
— AI-интерактивы и технологические квесты.
— Пространство для нетворкинга,
…а еще after-party со звездным лайн-апом.

Когда: 6 июня
Где: Москва, МТС Live Холл и онлайн
Участие бесплатно. Регистрация по ссылке.

Читать полностью…

C++ Academy

👾 Vita3K — экспериментальный эмулятор PlayStation Vita для Windows, Linux, macOS и Android. Проект уже демонстрирует впечатляющие результаты: часть коммерческих игр и множество homebrew-приложений запускаются, хотя разработчики предупреждают о возможных багах. Среди поддерживаемых игр — Persona 4 Golden, VA-11 HALL-A и другие культовые проекты.

Проект распространяется под лицензией GPLv2 и активно развивается благодаря поддержке сообщества. Важно отметить, что эмулятор не предназначен для пиратства — игры должны быть дампами с оригинальных носителей.

🤖 GitHub

@cpluspluc

Читать полностью…

C++ Academy

🔒 Microsoft ограничила работу своего C/C++ расширения в форках VS Code

Пользователи альтернативных редакторов на базе VS Code столкнулись с блокировкой проприетарного расширения для C/C++ от Microsoft. После обновления до версии 1.24.5 плагин начал выдавать ошибку, сообщая о возможности работы только в официальных продуктах Microsoft — VS Code, Visual Studio и связанных сервисах.

Ситуация вновь поднимает вопрос о зависимости open-source проектов от проприетарных дополнений. Пока единственное решение для тех, кому критично расширение от Microsoft — откат на старую версию и отключение автообновлений.

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

@cpluspluc

Читать полностью…

C++ Academy

🖥 Задача для собеседования: "Быстрая очередь с удалением элемента за O(1)"

🔖 Условие:

Реализуйте структуру данных — очередь (`queue`), поддерживающую три операции:

- enqueue(x) — добавить элемент в конец очереди (должно работать за O(1));
- dequeue() — удалить элемент из начала очереди и вернуть его (должно работать за O(1));
- remove(x) — удалить первое вхождение элемента x из очереди за O(1).

Ограничения:
- Элементы могут повторяться.
- Если элемент отсутствует, remove(x) не делает ничего.
- Операции должны оставаться эффективными на больших объемах данных (миллионы элементов).
- Можно использовать стандартные структуры данных STL (`list`, unordered_map, unordered_set и т.д.).

▪️ Дополнительные вопросы к кандидату:

- Как обеспечить O(1) удаление произвольного элемента из очереди?
- Как избежать утечек памяти или "битых" итераторов после удаления элементов?
- Что будет, если очередь будет содержать множество одинаковых элементов?
- Как бы вы изменили решение, если бы нужно было удалять все вхождения элемента, а не только первое?

---

▪️ Разбор возможного решения:


Основная архитектура:

- Используем std::list<int> data для хранения реальной очереди.
- Почему list? Потому что позволяет за O(1) удалять элементы по итератору.
- Используем std::unordered_map<int, std::list<std::list<int>::iterator>> index.
- Для каждого значения храним список итераторов на его вхождения в data.

Операции:

- enqueue(x):
- Добавляем x в конец data.
- Сохраняем итератор на него в index[x].
- Все действия — за O(1).

- dequeue():
- Удаляем элемент из начала data.
- Находим соответствующий итератор в index, удаляем его.
- Если в списке итераторов для этого значения больше нет элементов, удаляем ключ из index.

- remove(x):
- Если в index[x] есть итераторы:
- Берем первый итератор.
- Удаляем его из data и из списка итераторов.
- Если список стал пустым — удаляем запись x из index.
- Все действия — за O(1).

---

▪️ Возможные подводные камни:

- ❗ Не проверять, пустой ли index[x], перед удалением итератора.
- ❗ Не удалять ключи из unordered_map, что приводит к накоплению "пустых" списков в памяти.
- ❗ Использовать vector вместо list — тогда удаление из середины будет занимать O(n).

---

▪️ Мини-пример интерфейса класса:


#include <list>
#include <unordered_map>

class FastQueue {
private:
std::list<int> data;
std::unordered_map<int, std::list<std::list<int>::iterator>> index;

public:
void enqueue(int x) {
auto it = data.insert(data.end(), x);
index[x].push_back(it);
}

int dequeue() {
if (data.empty()) throw std::out_of_range("Queue is empty");
int val = data.front();
auto it = index[val].front();
index[val].pop_front();
if (index[val].empty()) {
index.erase(val);
}
data.pop_front();
return val;
}

void remove(int x) {
if (index.count(x) == 0) return;
auto it = index[x].front();
data.erase(it);
index[x].pop_front();
if (index[x].empty()) {
index.erase(x);
}
}
};


▪️ Дополнительные вопросы на усложнение:


- Что если нужно сделать removeAll(x) — удаление всех вхождений элемента?
- Как изменится решение, если в очереди будут сложные объекты вместо int?
- Как минимизировать использование памяти, если очередь очень большая?
- Как обеспечить безопасность потоков (thread-safety) для многопоточного варианта очереди?

@cpluspluc

Читать полностью…

C++ Academy

🌀 ZENO — node система для сложных 3D-симуляций. Этот фреймворк превращает алгоритмический код в визуальные ноды, позволяя создавать кинематографичные физические эффекты.

В отличие от коммерческих аналогов ZENO оптимизирован для работы с большими сценами и поддерживает GPU-ускорение через CUDA. Система включает готовые примеры симуляций, которые можно сразу загрузить и модифицировать.

🤖 GitHub

@cpluspluc

Читать полностью…

C++ Academy

🖥 В этой статье обсуждается ситуация, когда применение оптимизаций компилятора приводит к изменению поведения программы! Автор подчеркивает, что если поведение программы меняется при использовании определенного уровня оптимизации, это часто указывает на наличие неопределенного поведения в коде.

💡 Автор объясняет, что компиляторы, следуя правилу "as-if" (как если бы), могут применять любые преобразования кода, при условии, что они не изменяют его наблюдаемое поведение. Однако, если в программе присутствует неопределенное поведение, компилятор может производить оптимизации, которые изменяют поведение программы, поскольку исходное поведение не было строго определено

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

@cpluspluc

Читать полностью…

C++ Academy

🐍 PocketPy — легковесный интерпретатор Python для встраивания в C++ проекты. Разработчики позиционируют его как альтернативу Lua для игровых движков, где важны простота интеграции и отсутствие зависимостей.

Проект поддерживает совместимость с pybind11 и мобильными платформами. При этом интерпретатор демонстрирует производительность на уровне CPython 3.9 в базовых тестах.

🤖 GitHub

@cpluspluc

Читать полностью…

C++ Academy

🖥 Dear ImGui — библиотека GUI на C++ для быстрого создания интерфейсов без внешних зависимостей.

Оптимизирована для экономии памяти и легкой интеграции в проекты.

Позволяет быстро настраивать UI, избегая проблем с синхронизацией, и поддерживает разные графические API и платформы.

🔗 https://github.com/ocornut/imgui

@cpluspluc

Читать полностью…

C++ Academy

✔️ ЗАДАЧА: Что выведет код?



#include <iostream>
#include <vector>

struct Tracer {
Tracer(const char* name) : name(name) {
std::cout << "Constructing " << name << "\n";
}
~Tracer() {
std::cout << "Destructing " << name << "\n";
}
const char* name;
};

struct Example {
Tracer t1{"t1"};
std::vector<Tracer> list;
Tracer t2{"t2"};

Example() : list{Tracer("temp1"), Tracer("temp2")} {
std::cout << "Inside constructor\n";
}
};

int main() {
Example e;
std::cout << "End of main\n";
return 0;
}


---

ОТВЕТ:

Constructing t1
Constructing temp1
Constructing temp2
Inside constructor
Constructing t2
End of main
Destructing t2
Destructing temp2
Destructing temp1
Destructing t1

---

Почему так:

• Поля инициализируются в порядке объявления в структуре, а не в списке инициализации
• std::initializer_list создаёт временные объекты, которые копируются в вектор
• t2 создаётся после строки Inside constructor
• Деструкторы вызываются в обратном порядке: t2 → temp2 → temp1 → t1

Хитрость — в порядке инициализации, временных объектах и destructuring-порядке!


@cpluspluc

Читать полностью…

C++ Academy

🖥 Gooey — нативный кроссплатформенный GUI-фреймворк на C

Если ты разрабатываешь под Windows или Linux и хочешь лёгкий и настраиваемый UI, присмотрись к Gooey — фреймворку с нативной производительностью и открытым кодом.

Почему стоит:
• 🔥 На C, без библиотек-монстров
• 🔴 Работает везде
• 🧩 Кастомный UI
• 💥 Лёгкий и быстрый
• 🧪 С GPL v2 и сообществом

🚀 GitHub

@cpluspluc

Читать полностью…

C++ Academy

👩‍💻 Docker - лучший обучающий канал по Devops.

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

Стоит подписаться: t.me/DevopsDocker

Читать полностью…

C++ Academy

📄 toml++ — библиотека, предлагающий удобный и производительный способ обработки TOML файлов в C++-проектах. Этот парсер полностью соответствует спецификации TOML 1.0.0, поддерживает UTF-8 и может преобразовывать данные в JSON/YAML. При этом он не требует RTTI и может работать без исключений.

Интеграция системы проста: можно использовать как single версию или подключить через CMake/Conan/Vcpkg. Поддерживаются все основные компиляторы и архитектуры (x64, x86, ARM).

🤖 GitHub

@cpluspluc

Читать полностью…

C++ Academy

📊 Bebop — свежий взгляд на бинарную сериализацию. Этот проект сочетает читаемость JSON с производительностью бинарных протоколов, обещая в 10-100 раз большую скорость работы по сравнению с традиционными решениями.

Собственный язык схем позволяет генерировать типобезопасный код для C++, С#, TypeScript, Rust и других языков, сохраняя при этом кросс-платформенную совместимость. При этом проект уже сейчас демонстрирует высокую производительность в бенчмарках, особенно в сценариях, критичных к задержкам.

🤖 GitHub

@cpluscpluc

Читать полностью…
Subscribe to a channel