seniorcpp | Unsorted

Telegram-канал seniorcpp - Senior C++ Developer

13626

Изучаем C++. По вопросам сотрудничества: @adv_and_pr

Subscribe to a channel

Senior C++ Developer

Общие хитрости для C++

Никогда не используйте INT_MAX в качестве бесконечности для целых чисел. В некоторых алгоритмах, например, Флойда–Уоршелла, используются значения вроде ∞+w, что приведёт к переполнению при использовании INT_MAX. Вместо этого лучше использовать int oo = 0x3f3f3f3f, поскольку:
• Это число достаточно большое для задач, связанных с целыми числами;
• 2 * oo не приведёт к переполнению;
• Все байты равны, поэтому вы без проблем можете использовать memset(array, oo, sizeof(array));
• Его довольно легко запомнить.

Однако будьте осторожны: не используйте 0x3f3f3f3f для long long, так как в таком случае фокус уже не пройдёт, и вы потом потратите кучу времени на поиск ошибки.

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

Senior C++ Developer

Введение в UB

В языке C++ важную роль играют понятия неопределенное поведение undefined behavior, UB и определяемое реализацией поведение implementation-defined behavior, IB, характеризующие действия, результаты которых не определяются стандартом языка.

Когда некоторое действие объявляется как порождающее UB, это означает, что программист не должен полагаться на какой-то определенный результат — всё зависит от выбора компилятора в данном конкретном случае и особенностей платформы, причём разработчики платформы и компилятора не обязаны указывать в документации последствия такого действия. В случае IB, разработчик компилятора должен выбрать некоторую, разумную с его точки зрения, реализацию и описать это в документации.

Например, компилятор g++ известен тем, что при определённых условиях просто выбрасывает из программы участки, зависящие от неопределённого поведения.

К сожалению, программа, опирающаяся на конкретное поведение на данной платформе с данным компилятором, строго говоря, не является переносимой. Часто использование конструкций, эффект которых заявлен как IB или UB, является неосознанным из-за невнимательности, недостатка опыта или знаний программиста. Если, например, поведение программы различается в отладочной (debug, оптимизация машинного кода компилятором выключена) и окончательной (release, оптимизация включена) сборках, то, скорее всего, виноват код, порождающий UB.

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

Senior C++ Developer

Метод difftime()

Метод difftime() используется для вычисления разницы между двумя значениями времени в секундах.

Подробнее можно почитать здесь.

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

Senior C++ Developer

#вопросы_с_собеседований
Бывает такое, что оператор new не выделяет память?

Ответ:
Да, бывает, когда new передаётся указатель на уже выделенную память (например, с помощью malloc). Это называется placement new. И оператор new без изменения возвращает второй параметр - указатель (void* operator new(std::size_t, void*)). Это используется для создания объектов в выделенном "хранилище" или после malloc.

Важно! В этом случае деструктор нужно вызывать самостоятельно!

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

Senior C++ Developer

Опыт создания клипа на Unreal Engine 5.1 с метахьюманом, ветром и багами

https://habr.com/ru/post/714424/

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

Senior C++ Developer

Монадическая композиция Expected в C++

Здесь речь пойдёт о трюке, который ещё больше имитирует код под исключения C++.

Смотреть статью

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

Senior C++ Developer

Функция map::at()

Map - это контейнер в STL, который используется для хранения элементов в виде пары ключ-значение. Внутренне элементы map всегда сортируются по ее ключу. Карты в основном реализованы в виде бинарных деревьев поиска.

Функция map::at() используется для возврата ссылки на элемент, связанный с ключом k.

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

Senior C++ Developer

Как вывести в консоль числа от 1 до 100 без рекурсии и циклов?

В этой программе используется концепция метапрограммирования шаблонов.

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

Senior C++ Developer

Алгоритм upper_bound

Он возвращает итератор, указывающий на первый элемент в диапазоне [first, last), который больше значения, или last, если такой элемент не найден.

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

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

Senior C++ Developer

Просто о RCU (Read–Copy-Update)

Смотреть статью

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

Senior C++ Developer

Узнаем версию C++

Можно использовать макрос __cplusplus для определения версии C++. Например, если препроцессор увидит значение __cplusplus, равное 199711L, это означает, что используется C++98; значение 201103L указывает на C++11 и так далее.

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

Senior C++ Developer

#вопросы_с_собеседований
Сколько раз будут выполняться циклы внутри программы?

Ответ: в первом случае цикл не выполнится никогда, а во втором случае будет выполняться бесконечно.

Объяснение:
В первом цикле условие прекращения цикла имеет тип беззнакового char, значит, у нас присвоение n 256 вызовет переполнение и n станет равным 0. Цикл превратится в for(unsigned char i = 0; i < 0; ++i), а, значит, условие цикла не выполняется, и мы даже не войдём в тело цикла. Во втором цикле другая ситуация, он превращается в for(unsigned char i = 0; i < 256; ++i), и так как i не может быть больше, чем 255, то условие цикла будет выполняться всегда.

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

Senior C++ Developer

Алгоритм is_sorted_until

Используется для определения первого несортированного элемента в диапазоне [first, last). Он возвращает итератор к первому несортированному элементу в диапазоне, поэтому все элементы между первым и возвращенным итератором сортируются.

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

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

Senior C++ Developer

#вопросы_с_собеседований
Сколько раз будет выполняться этот цикл?

Если бы вы сказали 300, а i был объявлен как int, вы были бы правы. Но поскольку i объявлен как unsigned char, правильный ответ – зацикливание (бесконечный цикл).

Объясняем. Выражение 2 * half_limit будет повышаться до int (на основе правил преобразования C++) и заимеет значение 300. Но так как i – это unsigned char, он пересматривается по 8-битному значению, которое после достижения 255 будет переполняться, поэтому вернется к 0, и цикл будет продолжаться вечно.

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

Senior C++ Developer

Друзья, с наступающим Новым годом! 🎄✨
Спасибо, что вы с нами.

2025-й отлично показал, как быстро меняется индустрия: за год вышли новые думающие модели, которые сильно прокачали кодинг, анализ и мультимодальность.

Пусть 2026 принесёт вам спокойные релизы без ночных авралов, понятные ТЗ, сильные команды и проекты, которыми реально хочется гордиться. Пусть баги ловятся быстро, деплой проходит с первого раза, а нейросети становятся не магией, а надёжным инструментом в вашем рабочем наборе 😄
Счастья, здоровья и стабильного интернета — увидимся в новом году! 🚀💻🎉

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

Senior C++ Developer

Если бы рост в IT был лестницей, большинство было бы Senior.

Но на собеседованиях выясняется, что опыт, стаж и “я уже Middle” почти ничего не решают.

Илья Шишков 11 лет работал в Яндексе и провёл 250+ интервью и видел это постоянно. В канале @imhired разбирает, по каким признакам кандидатов относят к Junior, Middle и Senior - и почему многие готовятся совсем не к этому.

Начни с первого файла👇
(руководство по решению любой алгори...)

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

Senior C++ Developer

Введение в обработку исключений

Одним из преимуществ C++ перед C является обработка исключений. Исключения - это ненормальные условия, с которыми программа сталкивается во время своего выполнения.

Есть два типа исключений: а) синхронные, б) асинхронные (например, которые находятся вне контроля программы, сбой диска и т. д.). Для этой цели C++ предоставляет следующие специализированные ключевые слова.

try: представляет блок кода, который может вызвать исключение.
catch: представляет блок кода, который выполнится при возникновении определенного исключения.
throw: используется для создания исключения. Также используется для перечисления исключений, которые генерирует функция, но не обрабатывает себя.

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

Senior C++ Developer

Функция for_each()

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

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

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

Senior C++ Developer

Основные концепции библиотеки chrono (C++)

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

Для избежания таких ошибок предусмотрена библиотека chrono (namespace std::chrono). Она была добавлена в C++11 и дорабатывалась в поздних стандартах.

Смотреть статью

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

Senior C++ Developer

Что нам не нравится в C++

Смотреть статью

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

Senior C++ Developer

Вычисление количества цифр числа

Чтобы вычислить количество цифр в числе, вместо цикла мы можем эффективно использовать log.

В нашем примере мы получаем, что количество цифр числа 2468 равно 4.

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

Senior C++ Developer

Могут ли ссылки отсылать к недопустимому местоположению в памяти в C++?

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

Но есть пара исключений, когда у нас могут быть недействительные ссылки. Они приведены на картинке.

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

Senior C++ Developer

Алгоритм merge

Объединяет две отсортированные последовательности, ограниченные диапазонами [first1,last1) и [first2,last2), в единую отсортированную последовательность, начинающуюся с позиции result.

Шаблон:
merge (initer1 beg1, initer1 end1,
initer2 beg2, initer2 end2,
outiter res).

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

Senior C++ Developer

Алгоритм stable_partition

Упорядочивает последовательность, определенную параметрами start и end, так, чтобы все элементы, для которых предикат возвращал true, предшествовали тем, для которых предикат возвращает false. Разметка стабильная. Это означает, что относительный порядок последовательности сохраняется.

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

Senior C++ Developer

Функция resize

Изменяет размер контейнера так, чтобы он содержал n элементов.

Если n меньше текущего размера контейнера , содержимое сокращается до первых n элементов, удаляя все остальные (и уничтожая их).

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

Если n также больше, чем текущая вместимость контейнера, происходит автоматическое перераспределение выделенного пространства для хранения.

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

Senior C++ Developer

Указатели, ссылки и массивы в C и C++: точки над i

https://habr.com/ru/post/251091/

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

Senior C++ Developer

Определение новых исключений

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

Это приведет к следующему результату -
MyException caught
C++ Exception

Здесь what() - это открытый метод, предоставляемый классом исключений, и он был переопределен всеми дочерними классами исключений. Это возвращает причину исключения.

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

Senior C++ Developer

Пчела на работе, разработка игр на SFML C++

Пчела на работе – простая компьютерная игра, написанная на С++ используя мультимедийную библиотеку SFML.

Смотреть статью

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

Senior C++ Developer

Алгоритм generate

Используется для генерации чисел на основе функции генератора, а затем присваивает эти значения элементам в контейнере в диапазоне [first, last).

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

Senior C++ Developer

Что за ошибка в приведенном ниже коде и как ее исправить?

my_struct_t *bar;
/* ... делаем что-то, включая указание bar на определенный объект my_struct_t */
memset(bar, 0, sizeof(bar));

Последним аргументом memset должен быть sizeof(*bar), а не sizeof(bar). sizeof(bar) вычисляет размер bar (то есть самого указателя), а не размер структуры, на которую указывает bar. Поэтому код можно исправить, используя sizeof(*bar) в качестве последнего аргумента вызова memset.

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