🔥 Нужен Claude Pro? Подключим быстро, оплата российской картой
😏 Claude помогает во многих задачах: пишет, анализирует, объясняет и генерирует идеи. Пока ИИ работает, ты можешь сосредоточиться на главном.
🤔 Но оформить подписку Claude из РФ не так просто: нужна иностранная карта, а доступ может перестать работать в любой момент.
😉 Мы берём это на себя. Подключим Claude за 5–15 минут:
😎 Более 15 000 клиентов уже доверили нам оформление зарубежных сервисов. Если возникнут вопросы — всегда поможем и восстановим доступ.
🚀 Оформи Claude уже сегодня! А по промокоду CL300 ты получишь скидку в 300 руб. на первый заказ!
Заходи и оформляй у нас 👉 Claude Store
😏 Claude помогает во многих задачах: пишет, анализирует, объясняет и генерирует идеи. Пока ИИ работает, ты можешь сосредоточиться на главном.
🤔 Но оформить подписку Claude из РФ не так просто: нужна иностранная карта, а доступ может перестать работать в любой момент.
😉 Мы берём это на себя. Подключим Claude за 5–15 минут:
💳 Оплата российской картой или через СБП
⚡️ Быстрое подключение без лишних сложностей
🔒 Гарантия на весь срок подписки
😎 Более 15 000 клиентов уже доверили нам оформление зарубежных сервисов. Если возникнут вопросы — всегда поможем и восстановим доступ.
🚀 Оформи Claude уже сегодня! А по промокоду CL300 ты получишь скидку в 300 руб. на первый заказ!
Заходи и оформляй у нас 👉 Claude Store
👎11🔥2
Находим максимальный элемент через STL!
Иногда нужно найти самое большое значение: максимальную цену, лучший результат, самый длинный список или наибольший score.
Допустим, есть вектор чисел:
Можно искать максимум вручную:
Но в C++ для этого уже есть готовый алгоритм:
std::max_element возвращает итератор на максимальный элемент.
Поэтому перед использованием лучше проверить, что контейнер не пустой:
На выходе получим:
Если нужно искать максимум не по самому объекту, а по полю, можно передать компаратор:
Такой подход удобен для рейтингов, статистики, игр, отчётов и любых коллекций объектов.
📣 C++ Ready | #практика
Иногда нужно найти самое большое значение: максимальную цену, лучший результат, самый длинный список или наибольший score.
Допустим, есть вектор чисел:
std::vector<int> numbers = {5, 1, 9, 3};Можно искать максимум вручную:
int max_value = numbers[0];
for (int value : numbers) {
if (value > max_value) {
max_value = value;
}
}
Но в C++ для этого уже есть готовый алгоритм:
auto max_it = std::max_element(
numbers.begin(),
numbers.end()
);
std::max_element возвращает итератор на максимальный элемент.
Поэтому перед использованием лучше проверить, что контейнер не пустой:
if (max_it != numbers.end()) {
std::cout << *max_it << '\n';
}На выходе получим:
9
Если нужно искать максимум не по самому объекту, а по полю, можно передать компаратор:
auto best = std::max_element(
users.begin(),
users.end(),
[](const User& a, const User& b) {
return a.score < b.score;
}
);
Такой подход удобен для рейтингов, статистики, игр, отчётов и любых коллекций объектов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍10🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
В этом репозитории собрана большая подборка материалов по современному C++: книги, статьи, видео, библиотеки и полезные инструменты для работы с C++11/14/17/20. Особенно полезен тем, кто хочет разобраться в STL, многопоточности, управлении памятью, шаблонах и современных практиках разработки.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤5👍3
Сидеть и работать в корпорации — страшно, жизнь-то мимо проходит. Уходить строить бизнес — страшно, а вдруг прогорит. Один из вариантов — разрабатывать свой пет-проект по вечерам. Многие успешные компании, например, Twitter, создавались именно так. Это не значит, что ваш проект обязательно заработает миллиарды, но заработать больше, чем в найме, и получить ценный опыт — вполне реально.
Перед началом разработки появляется множество вопросов, например:
• Как выбрать идею для пет-проекта?
• Что нужно знать про маркетинг
• Как запуститься и довести до первых продаж не имея бюджета на рекламу?
В телеграм-канале «Твой пет проект», Михаил Табунов делится своим опытом с разработчиками и менеджерами.
Он рассказывает, где искать идею для нового проекта, что нужно знать о маркетинге, как запустить стартап и привлечь первых 10 клиентов, а также о многих других важных вещах.
Подписывайтесь на «Твой пет проект», получайте пользу от практиков рынка!
https://t.me/+8Frwa03ciVlhNTky
Перед началом разработки появляется множество вопросов, например:
• Как выбрать идею для пет-проекта?
• Что нужно знать про маркетинг
• Как запуститься и довести до первых продаж не имея бюджета на рекламу?
В телеграм-канале «Твой пет проект», Михаил Табунов делится своим опытом с разработчиками и менеджерами.
Он рассказывает, где искать идею для нового проекта, что нужно знать о маркетинге, как запустить стартап и привлечь первых 10 клиентов, а также о многих других важных вещах.
Подписывайтесь на «Твой пет проект», получайте пользу от практиков рынка!
https://t.me/+8Frwa03ciVlhNTky
Telegram
Твой пет проект
Канал про то, как создать свой маленький свечной заводик
Пишу про:
- Запуски и как сделать первые 10 продаж
- Прожарка идей
- Кейсы роста и ведения проекта параллельно с работой
Автор - Михаил Табунов - @bossofyourboss
Связь @to_baza_education
Пишу про:
- Запуски и как сделать первые 10 продаж
- Прожарка идей
- Кейсы роста и ведения проекта параллельно с работой
Автор - Михаил Табунов - @bossofyourboss
Связь @to_baza_education
Удаляем элементы из vector по условию в C++20!
Допустим, есть список чисел, и нужно удалить все чётные значения.
Раньше для такой задачи часто использовали erase-remove idiom:
Код рабочий, но выглядит тяжеловато, особенно для простой операции.
В C++20 появился более прямой вариант:
Функция удалит все элементы, для которых predicate вернёт true.
После выполнения в векторе останется:
Так можно удалять не только числа, но и объекты.
Например, убрать неактивных пользователей:
Это удобно для списков задач, событий, игровых объектов, очередей обработки и любых контейнеров, где нужно почистить элементы по условию.
📣 C++ Ready | #практика
Допустим, есть список чисел, и нужно удалить все чётные значения.
std::vector<int> nums = {1, 2, 3, 4, 5};Раньше для такой задачи часто использовали erase-remove idiom:
nums.erase(
std::remove_if(nums.begin(), nums.end(), [](int x) {
return x % 2 == 0;
}),
nums.end()
);
Код рабочий, но выглядит тяжеловато, особенно для простой операции.
В C++20 появился более прямой вариант:
std::erase_if(nums, [](int x) {
return x % 2 == 0;
});Функция удалит все элементы, для которых predicate вернёт true.
После выполнения в векторе останется:
1 3 5
Так можно удалять не только числа, но и объекты.
Например, убрать неактивных пользователей:
std::erase_if(users, [](const User& user) {
return !user.active;
});Это удобно для списков задач, событий, игровых объектов, очередей обработки и любых контейнеров, где нужно почистить элементы по условию.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍6🔥4
Напоминалка по std::string_view в C++!
Например, std::string_view позволяет передать строку без копирования, если функции нужно только прочитать текст.
На картинке шпаргалка по string_view: создание, доступ к символам, получение подстроки, сравнение и важные ограничения по времени жизни данных.
Сохрани, чтобы не потерять!
📣 C++ Ready | #ресурс
Например, std::string_view позволяет передать строку без копирования, если функции нужно только прочитать текст.
На картинке шпаргалка по string_view: создание, доступ к символам, получение подстроки, сравнение и важные ограничения по времени жизни данных.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤7🔥4
Менять vector во время обхода это плохая идея!
На первый взгляд код выглядит безобидно: идём по элементам и добавляем новые.
Но у std::vector есть важная особенность: при добавлении элементов он может перевыделить память.
То есть старый внутренний массив станет неактуальным, элементы переедут в новое место, а итераторы, ссылки и указатели могут стать недействительными.
Range-based for внутри тоже использует итераторы.
Поэтому менять размер vector во время такого обхода — опасный сценарий.
Лучше сначала запомнить исходный размер:
Теперь цикл обходит только старые элементы, а новые добавляются в конец и не влияют на количество итераций.
Если заранее понятно, сколько элементов добавится, можно ещё подготовить память:
Это уменьшит шанс лишних перевыделений.
Такая ошибка часто появляется при обработке очередей задач, графов, списков событий или генерации новых элементов на основе старых.
📣 C++ Ready | #совет
На первый взгляд код выглядит безобидно: идём по элементам и добавляем новые.
std::vector<int> v = {1, 2, 3};
for (int x : v) {
v.push_back(x);
}Но у std::vector есть важная особенность: при добавлении элементов он может перевыделить память.
То есть старый внутренний массив станет неактуальным, элементы переедут в новое место, а итераторы, ссылки и указатели могут стать недействительными.
Range-based for внутри тоже использует итераторы.
Поэтому менять размер vector во время такого обхода — опасный сценарий.
Лучше сначала запомнить исходный размер:
std::size_t n = v.size();
for (std::size_t i = 0; i < n; ++i) {
v.push_back(v[i]);
}
Теперь цикл обходит только старые элементы, а новые добавляются в конец и не влияют на количество итераций.
Если заранее понятно, сколько элементов добавится, можно ещё подготовить память:
v.reserve(v.size() * 2);
Это уменьшит шанс лишних перевыделений.
Такая ошибка часто появляется при обработке очередей задач, графов, списков событий или генерации новых элементов на основе старых.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤5👍3
Каждый найдет что-то по душе:
1202 ГБ — Python
1811 ГБ — Frontend
1100 ГБ — C / C++ / C#
804 ГБ — Java
411 ГБ — SQL & БД
309 ГБ — DevOps
998 ГБ — ИБ & Хакинг
773 ГБ — Kotlin / Swift
189 ГБ — PHP
201 ГБ — GoLang
170 ГБ — Rust
167 ГБ — QA / Тестирование
310 ГБ — 1C + Лицензии
495 ГБ — Машинное обучение
704 ГБ — Аналитика Данных
991 ГБ — Дизайн
Материалы в закрепе, постоянно пополняются👆🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
👎9
Сортируем контейнер через std::ranges::sort!
Допустим, есть вектор чисел, и нужно отсортировать его по возрастанию.
Раньше обычно писали так:
Работает, но приходится каждый раз передавать пару итераторов.
В C++20 можно использовать ranges-версию:
Теперь алгоритм принимает контейнер целиком.
После сортировки получим:
Если нужно отсортировать объекты по полю, можно использовать projection:
Здесь сортировка идёт не по всему объекту, а по полю
Это удобно для рейтингов, таблиц лидеров, списков товаров, отчётов и любых коллекций, где нужно быстро упорядочить данные.
📣 C++ Ready | #практика
Допустим, есть вектор чисел, и нужно отсортировать его по возрастанию.
std::vector<int> nums = {4, 1, 7, 3};Раньше обычно писали так:
std::sort(nums.begin(), nums.end());
Работает, но приходится каждый раз передавать пару итераторов.
В C++20 можно использовать ranges-версию:
std::ranges::sort(nums);
Теперь алгоритм принимает контейнер целиком.
После сортировки получим:
1 3 4 7
Если нужно отсортировать объекты по полю, можно использовать projection:
std::ranges::sort(users, {}, &User::score);Здесь сортировка идёт не по всему объекту, а по полю
score.Это удобно для рейтингов, таблиц лидеров, списков товаров, отчётов и любых коллекций, где нужно быстро упорядочить данные.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥7❤3
Не копируй элементы в цикле, если их можно читать по ссылке!
В C++ range-based for часто пишут так:
Для int или char это нормально.
Но если внутри лежат строки, структуры, объекты или большие классы, каждый элемент будет копироваться.
Например:
Если User тяжёлый, такой цикл создаёт лишние копии.
Когда нужно только читать элементы, лучше использовать const auto&:
Так объект не копируется, а код всё равно не может случайно его изменить.
Если элемент нужно менять тогда используют обычную ссылку:
А если нужен отдельный независимый объект, тогда копия через auto как раз уместна.
📣 C++ Ready | #совет
В C++ range-based for часто пишут так:
for (auto x : items) {
use(x);
}Для int или char это нормально.
Но если внутри лежат строки, структуры, объекты или большие классы, каждый элемент будет копироваться.
Например:
for (auto user : users) {
std::cout << user.name << '\n';
}Если User тяжёлый, такой цикл создаёт лишние копии.
Когда нужно только читать элементы, лучше использовать const auto&:
for (const auto& user : users) {
std::cout << user.name << '\n';
}Так объект не копируется, а код всё равно не может случайно его изменить.
Если элемент нужно менять тогда используют обычную ссылку:
for (auto& user : users) {
user.active = true;
}А если нужен отдельный независимый объект, тогда копия через auto как раз уместна.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍8🔥5😁2
Почему std::string_view может неожиданно превратиться в висячую ссылку?
std::string_view не хранит собственную строку. Он содержит только ссылку на уже существующие символы.
Поэтому возвращать view на локальный std::string опасно:
После выхода из функции name уничтожается, а результат указывает в освобождённую память.
Если функция создаёт новую строку, возвращай std::string:
view также может стать недействительным после изменения исходной строки:
При расширении text может получить новый буфер, а view останется связан со старым.
Безопасный вариант будет использовать данные с достаточным временем жизни:
Строковый литерал существует до завершения программы, поэтому такой view остаётся корректным.
📣 C++ Ready | #совет
std::string_view не хранит собственную строку. Он содержит только ссылку на уже существующие символы.
Поэтому возвращать view на локальный std::string опасно:
std::string_view make_name() {
std::string name = "Ready";
return name;
}После выхода из функции name уничтожается, а результат указывает в освобождённую память.
Если функция создаёт новую строку, возвращай std::string:
std::string make_name() {
return "Ready";
}view также может стать недействительным после изменения исходной строки:
std::string text = "C++";
std::string_view view = text;
text += std::string(100, '!');
При расширении text может получить новый буфер, а view останется связан со старым.
Безопасный вариант будет использовать данные с достаточным временем жизни:
constexpr std::string_view channel = "C++ Ready";
std::cout << channel;
Строковый литерал существует до завершения программы, поэтому такой view остаётся корректным.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6❤4👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Это набор рекомендаций по современному C++, который помогает писать более безопасный, понятный и поддерживаемый код. Здесь собраны практические правила по работе с памятью, классами, функциями, шаблонами, ошибками и архитектурой.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤9👍6
Разработчики из Anthropic обновили и структурировали масштабный хаб готовых запросов для своей языковой модели. База создана для того, чтобы пользователи могли выжать максимум из Claude при решении прикладных и технических задач, не тратя время на самостоятельный подбор формулировок.
🟦 Для безопасности: готовые конструкции для проверки кода на уязвимости и анализа граничных условий работы алгоритмов.
🟦 Для разработчиков: шаблоны для глубокого ревью кода, автоматического поиска багов, рефакторинга, написания юнит-тестов и проектирования архитектуры.
🟦 Для автоматизации и менеджмента: промпты под стратегическое планирование, парсинг неструктурированных данных, генерацию технической документации и выстраивание логики для ИИ-агентов.
Каждый шаблон снабжен подробным разбором: авторы пошагово объясняют, почему выбрана именно такая структура запроса, как модель интерпретирует переменные и как правильно передавать контекст. Поскольку библиотека официальная, все промпты оптимизированы под особенности контекстного окна и логику мышления последних моделей семейства Claude.
Нейросети отлично автоматизируют рутину и помогают искать уязвимости, но управлять ими может только тот, кто понимает саму базу и суть киберугроз.
Если вы хотите заложить мощный фундамент начните с нашего бесплатного курса (его прошли уже 1108 человек!).
🟦 Разберетесь, как работают кибератаки и как грамотно защитить свои данные.
🟦 Познакомитесь с направлениями и профессиями в кибербезопасности, чтобы выбрать свой трек.
🟦 Получите скидку, если решите продолжить обучение в CyberYozh Academy.
👉 Начните бесплатно прямо сейчас
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥1
Измеряем время выполнения блока кода на C++!
Создадим небольшой RAII-таймер. Он начнёт измерение при создании и автоматически покажет результат при выходе из области видимости.
Сохраним название операции и время запуска:
Добавим конструктор:
В деструкторе вычислим прошедшее время:
Остаётся вывести результат и закрыть класс:
Теперь измерим сортировку:
После выхода из блока деструктор вызовется автоматически:
steady_clock подходит для измерения интервалов, потому что не зависит от перевода системных часов.
📣 C++ Ready | #практика
Создадим небольшой RAII-таймер. Он начнёт измерение при создании и автоматически покажет результат при выходе из области видимости.
Сохраним название операции и время запуска:
class ScopeTimer {
std::string name_;
std::chrono::steady_clock::time_point start_;Добавим конструктор:
public:
explicit ScopeTimer(std::string name)
: name_(std::move(name)),
start_(std::chrono::steady_clock::now()) {}
В деструкторе вычислим прошедшее время:
ScopeTimer() {
const auto elapsed =
std::chrono::steady_clock::now() - start_;
const auto microseconds =
std::chrono::duration_cast<
std::chrono::microseconds
>(elapsed);Остаётся вывести результат и закрыть класс:
std::cout << name_ << ": "
<< microseconds.count()
<< " us\n";
}
};
Теперь измерим сортировку:
{
ScopeTimer timer("sorting");
std::ranges::sort(values);
}После выхода из блока деструктор вызовется автоматически:
sorting: 1842 us
steady_clock подходит для измерения интервалов, потому что не зависит от перевода системных часов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥7❤3
Шпаргалка по форматированию вывода в C++!
Например, {:.2f} оставляет два знака после запятой, {:08} дополняет число нулями, а {:x} выводит его в шестнадцатеричном формате.
На картинке синтаксис библиотеки {fmt}: позиционные и именованные аргументы, выравнивание, ширина, точность, системы счисления, строки, указатели, диапазоны и кортежи.
Сохрани, чтобы не потерять!
📣 C++ Ready | #ресурс
Например, {:.2f} оставляет два знака после запятой, {:08} дополняет число нулями, а {:x} выводит его в шестнадцатеричном формате.
На картинке синтаксис библиотеки {fmt}: позиционные и именованные аргументы, выравнивание, ширина, точность, системы счисления, строки, указатели, диапазоны и кортежи.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤6🔥6
Почему чтение через map[key] может изменить контейнер?
Обращение через квадратные скобки выглядит как обычное получение значения:
Но если ключа "api" ещё нет, operator[] автоматически создаст его и добавит значение по умолчанию.
Для int таким значением будет 0:
Получается, что код только читал значение, но размер контейнера изменился.
Если нужно найти ключ без вставки, используйте find():
Начиная с C++20 наличие ключа можно проверить через contains():
at() не создаёт новый элемент. Если ключ отсутствует, метод выбросит std::out_of_range.
При подсчёте событий поведение operator[], наоборот, очень удобно:
Используйте map[key], когда автоматическая вставка допустима. Для чтения без изменения контейнера выбирайте find(), contains() или at().
📣 C++ Ready | #совет
Обращение через квадратные скобки выглядит как обычное получение значения:
std::cout << hits["api"];
Но если ключа "api" ещё нет, operator[] автоматически создаст его и добавит значение по умолчанию.
Для int таким значением будет 0:
std::map<std::string, int> hits;
std::cout << hits["api"]; // 0
std::cout << hits.size(); // 1
Получается, что код только читал значение, но размер контейнера изменился.
Если нужно найти ключ без вставки, используйте find():
auto it = hits.find("api");
if (it != hits.end()) {
std::cout << it->second;
}Начиная с C++20 наличие ключа можно проверить через contains():
if (hits.contains("api")) {
std::cout << hits.at("api");
}at() не создаёт новый элемент. Если ключ отсутствует, метод выбросит std::out_of_range.
При подсчёте событий поведение operator[], наоборот, очень удобно:
++hits["api"];
++hits["api"];
std::cout << hits["api"]; // 2
Используйте map[key], когда автоматическая вставка допустима. Для чтения без изменения контейнера выбирайте find(), contains() или at().
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4🔥3
Современный C++23 на компьютере с Windows 95!
В этой статье:
• Как получить совместимый 32-битный код современным компилятором
• Зачем объектные файлы передаются старому линкеру Visual C++
• Как заменить недоступные части стандартной библиотеки и работать через WinAPI
📣 C++ Ready | #статья
В этой статье:
• Как получить совместимый 32-битный код современным компилятором
• Зачем объектные файлы передаются старому линкеру Visual C++
• Как заменить недоступные части стандартной библиотеки и работать через WinAPI
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8😁4❤2🔥1
IT мероприятия 🤘
Всё самое интересное для карьеры в IT: митапы, хакатоны, конференции, стажировки и обучение.
Подписывайся🤘
1. Москва
2. Санкт-Петербург
3. Для стажеров и студентов
Всё самое интересное для карьеры в IT: митапы, хакатоны, конференции, стажировки и обучение.
Подписывайся
1. Москва
2. Санкт-Петербург
3. Для стажеров и студентов
Please open Telegram to view this post
VIEW IN TELEGRAM
std::string_view не владеет строкой и в этом легко ошибиться!
Поэтому такой код опасен:
Если
Безопасный вариант сначала сохранить строку:
Теперь
Такой метод принимает строковые литералы,
А вот возвращать представление локальной строки нельзя:
После выхода из функции
📣 C++ Ready | #совет
std::string_view хранит только указатель на символы и их количество. Он не копирует текст и не продлевает время жизни исходной строки.Поэтому такой код опасен:
std::string_view name = make_name();
Если
make_name() возвращает std::string, временная строка уничтожается в конце выражения. После этого name продолжает указывать на уже недействительную память.Безопасный вариант сначала сохранить строку:
std::string name = make_name();
std::string_view view = name;
Теперь
view можно использовать, пока существует name и операции со строкой не сделали указатель недействительным.string_view хорошо подходит для параметров функций, которые только читают текст:void print_name(std::string_view name) {
std::cout << name << '\n';
}Такой метод принимает строковые литералы,
std::string и другие непрерывные последовательности символов без лишнего копирования:std::string user = "Alex";
print_name(user);
print_name("Admin");
А вот возвращать представление локальной строки нельзя:
std::string_view get_status() {
std::string status = "ready";
return status;
}После выхода из функции
status уничтожается, а возвращённый string_view становится висячим.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤5👍3