⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
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
Разработка игр: https://t.me/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: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
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
Разработка игр: https://t.me/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: https://t.me/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.me/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy
Реализуйте структуру данных — очередь (`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
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑🏻💻Хотите научиться писать нейросети на одном из самых быстрых и безопасных языков программирования?
На открытом уроке 6 мая в 20:00 МСК мы научим вас создавать простейшую нейросеть с нуля, используя минимальные библиотеки. Вы не только познакомитесь с Rust, но и узнаете, как оптимизировать вычисления для работы с нейронными сетями.
Вы сможете писать быстрые и эффективные нейросети на Rust — языке, который сегодня активно используется для решения высоконагруженных задач.
👉Присоединяйтесь к открытому уроку и получите скидку на программу обучения «Rust Developer. Basic»: https://otus.pw/417k/?erid=2W5zFFxssur
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
На открытом уроке 6 мая в 20:00 МСК мы научим вас создавать простейшую нейросеть с нуля, используя минимальные библиотеки. Вы не только познакомитесь с Rust, но и узнаете, как оптимизировать вычисления для работы с нейронными сетями.
Вы сможете писать быстрые и эффективные нейросети на Rust — языке, который сегодня активно используется для решения высоконагруженных задач.
👉Присоединяйтесь к открытому уроку и получите скидку на программу обучения «Rust Developer. Basic»: https://otus.pw/417k/?erid=2W5zFFxssur
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🔒 Microsoft ограничила работу своего C/C++ расширения в форках VS Code
Пользователи альтернативных редакторов на базе VS Code столкнулись с блокировкой проприетарного расширения для C/C++ от Microsoft. После обновления до версии 1.24.5 плагин начал выдавать ошибку, сообщая о возможности работы только в официальных продуктах Microsoft — VS Code, Visual Studio и связанных сервисах.
Ситуация вновь поднимает вопрос о зависимости open-source проектов от проприетарных дополнений. Пока единственное решение для тех, кому критично расширение от Microsoft — откат на старую версию и отключение автообновлений.
🔗 Ссылка - *клик*
@cpluspluc
Пользователи альтернативных редакторов на базе VS Code столкнулись с блокировкой проприетарного расширения для C/C++ от Microsoft. После обновления до версии 1.24.5 плагин начал выдавать ошибку, сообщая о возможности работы только в официальных продуктах Microsoft — VS Code, Visual Studio и связанных сервисах.
Ситуация вновь поднимает вопрос о зависимости open-source проектов от проприетарных дополнений. Пока единственное решение для тех, кому критично расширение от Microsoft — откат на старую версию и отключение автообновлений.
🔗 Ссылка - *клик*
@cpluspluc
Лайфхаки визуального сторителлинга 😉
Рассказываем, почему это полезно и как его построить, чтобы было понятно всем: и менеджерам, и разработчикам, и дизайнерам⬆
И да, вы справитесь, даже если не умеете рисовать! Александр Зинченко, СТО Яндекс 360, поделился инструментами для быстрых и удобных скетчей. А ещё рассказал про сложности передачи идей в проектных командах, которые можно решить с помощью визуального сторителлинга😎
Больше интересной и полезной информации в канале от команды Яндекс 360
Рассказываем, почему это полезно и как его построить, чтобы было понятно всем: и менеджерам, и разработчикам, и дизайнерам
И да, вы справитесь, даже если не умеете рисовать! Александр Зинченко, СТО Яндекс 360, поделился инструментами для быстрых и удобных скетчей. А ещё рассказал про сложности передачи идей в проектных командах, которые можно решить с помощью визуального сторителлинга
Больше интересной и полезной информации в канале от команды Яндекс 360
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👾 Vita3K — экспериментальный эмулятор PlayStation Vita для Windows, Linux, macOS и Android. Проект уже демонстрирует впечатляющие результаты: часть коммерческих игр и множество homebrew-приложений запускаются, хотя разработчики предупреждают о возможных багах. Среди поддерживаемых игр — Persona 4 Golden, VA-11 HALL-A и другие культовые проекты.
Проект распространяется под лицензией GPLv2 и активно развивается благодаря поддержке сообщества. Важно отметить, что эмулятор не предназначен для пиратства — игры должны быть дампами с оригинальных носителей.
🤖 GitHub
@cpluspluc
Проект распространяется под лицензией GPLv2 и активно развивается благодаря поддержке сообщества. Важно отметить, что эмулятор не предназначен для пиратства — игры должны быть дампами с оригинальных носителей.
🤖 GitHub
@cpluspluc
🔧 OpenXRay — движок STALKER с открытым исходным кодом получает вторую жизнь.
Сообщество энтузиастов серии STALKER продолжает развивать OpenXRay — улучшенную версию оригинального движка X-Ray Engine. Проект не просто исправляет баги и добавляет 64-битную поддержку, но и открывает новые возможности для модификации игр.
Хотя разработчики подчеркивают стремление сохранить ванильный геймплей, проект уже включает оптимизации рендеринга, поддержку геймпадов и новые инструменты для модмейкеров.
🤖 GitHub
@cpluspluc
Сообщество энтузиастов серии STALKER продолжает развивать OpenXRay — улучшенную версию оригинального движка X-Ray Engine. Проект не просто исправляет баги и добавляет 64-битную поддержку, но и открывает новые возможности для модификации игр.
Хотя разработчики подчеркивают стремление сохранить ванильный геймплей, проект уже включает оптимизации рендеринга, поддержку геймпадов и новые инструменты для модмейкеров.
🤖 GitHub
@cpluspluc
🎯 ▪ Задача: "Числа-близнецы с кастомным компаратором" (C++ для продвинутых)
У вас есть массив
1.
2.
3. Если таких пар несколько, вернуть все, отсортированные по A, затем по B
▪ Ограничения:
-
-
▪ Пример:
Вход:
Вывод:
✅ Минимальная разница = 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, чтобы избежать сортировки массивов и упростить логику поиска ближайших чисел.
У вас есть массив
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
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, чтобы избежать сортировки массивов и упростить логику поиска ближайших чисел.
@cpluspluc
Please open Telegram to view this post
VIEW IN TELEGRAM
🦾 Задача с подвохом: Виртуальные функции и конструкторы
Условие:
Что выведет следующий код и почему?
❓ Вопрос:
Что будет выведено? Почему результат может удивить даже опытных C++ разработчиков?
🔍 Разбор:
1️⃣ Мы создаём объект.
Это вызывает конструктор , но сначала выполняется конструктор `Base` (по правилам иерархии).
2️⃣ В конструкторе есть вызов .
Может показаться, что поскольку объект на самом деле , вызовется .
Но! Вот главный подвох:
➡️ В C++, когда вы вызываете виртуальную функцию из конструктора (или деструктора), она не виртуальна для объекта, который ещё не полностью сконструирован.
На момент вызова объект всё ещё только Base, потому что ещё не инициализирован.
✅ Пошаговое выполнение:
- Вызов конструктора :
```
Base constructor
```
- Вызов внутри конструктора :
Это вызовет Base::foo(), а не :
```
Base foo
```
- После завершения конструктора , вызывается конструктор :
```
Derived constructor
```
✅ Итоговый вывод:
```
Base constructor
Base foo
Derived constructor
```
💥 Подвох:
• Многие ожидают, что виртуальные функции работают «магически» всегда.
• Но при вызове из конструктора (или деструктора) виртуальные функции не полиморфны, потому что объект ещё не «стал» Derived полностью.
🛡️ Что нужно помнить:
Никогда не полагайтесь на вызовы виртуальных функций в конструкторах/деструкторах для вызова методов производных классов. Это источник трудноуловимых багов.
✅ Вывод:
C++ строго следует правилам объектной модели: пока объект конструируется (или разрушается), он считается экземпляром того класса, конструктор которого выполняется в данный момент. Это поведение важно помнить при проектировании иерархий классов!
@cpluspluc
Условие:
Что выведет следующий код и почему?
#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
2️⃣ В конструкторе
Base
foo();
Может показаться, что поскольку объект на самом деле
Derived
Derived::foo()
Но! Вот главный подвох:
➡️ В C++, когда вы вызываете виртуальную функцию из конструктора (или деструктора), она не виртуальна для объекта, который ещё не полностью сконструирован.
На момент вызова
foo()
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
💥 CLion теперь бесплатен для некоммерческих проектов! 😮
CLion — мощная IDE для разработки на C и C++, стала доступна бесплатно для:
• студентов и всех, кто изучает программирование
• разработчиков open source-проектов
• создателей обучающего и технического контента
Отличная возможность работать в профессиональной среде без затрат 💻
👉 Официальная шпаргалка по горячим клавишам для CLion: https://resources.jetbrains.com/storage/products/clion/docs/CLion_reference_card_all.pdf
@cpluspluc
CLion — мощная IDE для разработки на C и C++, стала доступна бесплатно для:
• студентов и всех, кто изучает программирование
• разработчиков open source-проектов
• создателей обучающего и технического контента
Отличная возможность работать в профессиональной среде без затрат 💻
👉 Официальная шпаргалка по горячим клавишам для CLion: https://resources.jetbrains.com/storage/products/clion/docs/CLion_reference_card_all.pdf
@cpluspluc