
- Главная
- Каталог
- Интернет технологии
- C/C++ Ready | Программирование
C/C++ Ready | Программирование
Авторский канал по разработке на C и C++
Статистика канала
optional выглядит как “объект, которого может не быть”, и из-за этого его легко мысленно приравнять к указателю. Но это другая модель.
std::optional<T> хранит значение внутри себя.
То есть если значение есть, объект T находится прямо внутри optional, а не где-то отдельно в памяти.
Например:
std::optional<std::string> name = "Gus";{}
здесь optional не указывает на строку — он содержит строку внутри себя.
Из-за этого у optional другая семантика:
• копирование optional копирует и само значение • перемещение optional перемещает значение • optional не подходит как замена ссылке • отсутствие значения — это отдельное состояние самого объекта, а не nullptrПоэтому
optional удобен, когда функция может вернуть значение или не вернуть ничего:
std::optional<User> find_user(int id);{}
Но если тебе нужна именно не-владеющая ссылка на уже существующий объект, optional для этого обычно не лучший инструмент.
std::optional<T> — это контейнер для “значение есть или его нет”, а не просто красивый указатель.
[=] копирует только локальные переменные из текущей области видимости.
Но если внутри метода класса ты обращаешься к полям объекта, на самом деле захватывается не сам объект целиком, а указатель this.
В таком коде:
cpp id="r8n2fs"
pool.enqueue([=] {
process(data_);
});{}
может казаться, что data_ безопасно скопирован внутрь lambda. Но это не так.
Фактически lambda использует this, а значит обращается к полю исходного объекта.
Если к моменту выполнения задачи объект уже уничтожен, код получит висячий указатель и undefined behavior.
Из-за этого баг особенно неприятный:
• внешне всё выглядит как “захват по значению” • код может долго работать нормально • а потом упасть в асинхронном сценарии, где объект уже не живётЕсли нужен именно снимок данных на момент создания lambda, лучше захватывать его явно:
cpp id="x1kz7d"
auto data = data_;
pool.enqueue([data] {
process(data);
});{}
А если нужен сам объект, важно явно контролировать его lifetime.
[=] внутри метода класса не копирует поля объекта автоматически. Чаще всего ты захватываешь this, а не данные.
— Плюсы: кодинг, миллион токенов контекста и агентский режим — Минусы: логические ошибки, нужно присматривать в сложных задачахБольше всего зацепила именно работа агента. Решил проверить его на своей «боли» — навел порядок в подписках Telegram. В последнее время лента превратилась в бесконечный шум с постами об одном и том же. Дал задачу нейронке: просмотреть мои подписки, убрать лишнее и оставить только тех, кто пишет про реальный опыт, автоматизацию и внедрение ИИ в работу. Модель сама просканировала каналы и собрала отличную подборку. Результат получился реально адекватным, поэтому делюсь этой подборкой. Авторы, которые каждый день пишут полезные об IT и AI доступно и интересно. Подписывайтесь на лучших Tech-специалистов https://t.me/addlist/81ejyxxH4rM0ZDIy
std::map, если ключа ещё нет, код часто превращается в проверку через find, а потом отдельную вставку. Работает, но получается многословно.
В C++17 для этого есть try_emplace. Он добавляет элемент только если такого ключа ещё нет.
Например:
#include <map>
#include <string>
#include <iostream>
std::map<std::string, int> counters;
counters.try_emplace("errors", 0);{}
Если ключа "errors" ещё не было, он появится со значением 0.
Если ключ уже есть, значение не будет перезаписано:
counters["errors"] = 5;
counters.try_emplace("errors", 0);
std::cout << counters["errors"] << '\n'; // 5{}
Это удобно, когда значение дорого создавать или когда важно не затереть уже существующие данные.
try_emplace также возвращает пару: итератор и флаг, была ли вставка выполнена.
auto [it, inserted] = counters.try_emplace("warnings", 0);
if (inserted) {
std::cout << "created\n";
} else {
std::cout << "already exists\n";
}{}
Так код явно показывает намерение: добавить значение только при отсутствии ключа, без лишних проверок и случайного перезаписывания.
try_emplace помогает аккуратно добавлять элементы в map: только если ключа ещё нет.
• структура блочного шифра и работа с 64-битными числами
• генерация ключа и преобразования через XOR, NOT и циклические сдвиги
• примеры функций шифрования, расшифровки и изменения ключа
🔊 Продолжай читать на habr!
Отзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
C/C++ Ready | Программирование — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 14.6K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 11.8, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 2377.62 ₽, а за 17 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий