Как не копировать лишнее в циклах?
В варианте
Чаще всего достаточно ссылки на уже существующий объект:
Когда объект нужно именно «забрать», делаем это явно:
🔥 Итог: перебирай контейнеры через
📣 C++ Ready | #совет
В варианте
for (auto user : users) каждый элемент вектора копируется. Если структура тяжёлая — это лишние аллокации и падение производительности.Чаще всего достаточно ссылки на уже существующий объект:
for (const auto& user : users) { ... } // без копий, только чтениеauto& — ссылка без копии, const auto& — ссылка только для чтения.Когда объект нужно именно «забрать», делаем это явно:
for (auto& user : users) {
process(std::move(user));
}auto& / const auto&, а перенос делай явным std::move — меньше скрытых копий и понятнее код. Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍12🔥7
Убираем ворнинги красиво — атрибут [[maybe_unused]]
Часто в коде появляются переменные или параметры, которые нужны только в отладке или “на будущее”.
Компилятор тут же ругается:
С атрибутом
Например, параметр, который нужен только в отладочной сборке:
Точно так же можно помечать локальные переменные, которые используются только в
Атрибут можно навесить и на всю функцию, если она может пока ниоткуда не вызываться:
🔥
📣 C++ Ready | #практика
Часто в коде появляются переменные или параметры, которые нужны только в отладке или “на будущее”.
Компилятор тут же ругается:
unused variable / unused parameter. Удалять их не всегда удобно, а вот пометить — можно.С атрибутом
[[maybe_unused]] ты прямо говоришь компилятору: «эта штука может не использоваться — это ок».Например, параметр, который нужен только в отладочной сборке:
void handle_request(int id, int debug_code [[maybe_unused]]) {
#ifdef DEBUG
// В отладке логируем больше деталей
log_debug("debug_code = " + std::to_string(debug_code));
#endif
// основная логика обработки запроса
process(id);
}Точно так же можно помечать локальные переменные, которые используются только в
assert или временно отключены:void foo() {
int value [[maybe_unused]] = compute_something();
// допустим, пока проверка отключена
// assert(value > 0);
do_work();
}Атрибут можно навесить и на всю функцию, если она может пока ниоткуда не вызываться:
[[maybe_unused]]
void debug_dump_state() {
// вспомогательная отладочная функция
}
[[maybe_unused]] помогает держать код аккуратным: ты явно показываешь намерение и убираешь лишние ворнинги без костылей и странных #ifdef вокруг каждой строки.Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥13👍4👎1
На картинке — цветная таблица со всеми основными статусами: от успешных 2xx до фатальных 5xx, чтобы быстро вспомнить, что скрывается за 404, 418 или 500, не шарясь по документации.
Сохрани, чтобы всегда под рукой был словарь ответов любого веб-сервиса!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11🤝9❤4👍2😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26🤝16👍5❤2😁2
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤12👍6
В этой статье:
• Понять, зачем нужны умные указатели и автоматическое управление памятью• Разобраться в различиях unique_ptr, shared_ptr и weak_ptr на примерах• Научиться выбирать подходящий умный указатель и избегать типичных ошибок🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍9❤4
Как перестать писать begin()/end() вручную?
Классический цикл выглядит так:
Здесь много «технического шума»: итераторы,
Range-based for делает то же самое короче и понятнее:
А если нужно менять элементы, можно сразу работать по ссылке:
🔥 Итог: используй range-based for вместо явных
📣 C++ Ready | #совет
Классический цикл выглядит так:
for (auto it = scores.begin(); it != scores.end(); ++it) {
std::cout << *it << '\n';
}Здесь много «технического шума»: итераторы,
begin()/end(), разыменование *it.Range-based for делает то же самое короче и понятнее:
for (int score : scores) {
std::cout << score << '\n';
}А если нужно менять элементы, можно сразу работать по ссылке:
for (int& score : scores) {
score += 10;
}begin()/end() — меньше шума, меньше поводов ошибиться, код читается как «пройти по всем элементам контейнера».Please open Telegram to view this post
VIEW IN TELEGRAM
🤝15👍10❤4👎2😁2
This media is not supported in your browser
VIEW IN TELEGRAM
Блог Артура О’Дуайера, тренера и участника комитета стандартизации C++, с глубокими разборками современного C++: STL, предложения в стандарт, «тёмные уголки» языка, производительность и нетривиальные баги из реального кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤5👍3
Небольшая программа превращает обычный текстовый словарик в живую тренировку памяти: вопросы появляются случайно, а каждый ответ тут же показывает, насколько ты внимателен.
В этой задаче узнаешь:
• Как превращать список слов в живые вопросы;
• Почему короткие сессии повторения укрепляют память лучше зубрёжки;
• Что меняется, когда ответы сразу показывают твой прогресс.
Пара строк текста в файле — и у тебя есть личный учитель, который терпеливо задаёт вопросы хоть каждый день.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥9❤5👎1🤝1