Senior C++ Developer
11.6K subscribers
1.49K photos
3 videos
638 links
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
Алгоритм reverse_copy

Алгоритм копирует элементы из заданного диапазона, но в обратном порядке.

Принимает три параметра. Первые два параметра — это диапазон копируемых элементов, а третий параметр — начальная точка, из которой элементы копируются в обратном порядке.
#вопросы_с_собеседований
Что будет выведено и почему?

Ответ:
4294967271, предполагая 32-битные целые числа.

Почему так происходит?

Существует иерархия: long double, double, float, unsigned long int, long int, unsigned int, int. И когда два операнда определены как 25u (unsigned int) и 50 (int), 50 также будет интерпретироваться как беззнаковое целое число, то есть 50u.

Кроме того, результат операции также будет иметь тип операндов. Следовательно, результат 25u - 50u и сам является беззнаковым целым числом. Таким образом, результат -25 преобразуется в 4294967271.
std::reference_wrapper

std::reference_wrapper — это класс в C++, предоставляемый стандартной библиотекой, который оборачивает ссылку на объект. Этот класс полезен, когда вам нужно передать или хранить ссылку на объект, но вы хотите избежать неявного копирования объекта.

Основное назначение std::reference_wrapper заключается в том, чтобы позволить передавать ссылки как аргументы функций, которые обычно ожидают копии объектов. Это особенно полезно, например, при использовании алгоритмов из стандартной библиотеки, которые могут копировать элементы контейнера, если не явно указано иначе.

#для_начинающих
Алгоритм partial_sort

Используется для сортировки не всего диапазона, а только его части.

Он переставляет элементы в диапазоне [first, last) таким образом, что элементы до середины сортируются в порядке возрастания, тогда как элементы после середины остаются без какого-либо определенного порядка.
#вопросы_с_собеседований
Как работает RTTI?

RTTI расшифровывается как "Run-Time Type Information" и является функцией в C++, которая предоставляет информацию о типе объекта во время выполнения. Она позволяет вам динамически запрашивать и манипулировать информацией о типе объекта.

В C++ информация о типе объектов обычно представлена механизмом, называемым классом type_info. Класс type_info является частью стандартной библиотеки C++ и определяется в заголовке <typeinfo>.

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

RTTI особенно полезен, когда у вас есть указатель на базовый класс или ссылка на объект производного класса. RTTI обеспечивает безопасную передачу указателя базового класса в производный класс и выполнение определенных операций. Для этого используется оператор dynamic_cast, который выполняет динамическое приведение и возвращает указатель или ссылку целевого типа, если приведение корректно, или нулевой указатель, или выбрасывает исключение, если приведение не удалось.
Ленивые вычисления в С++

lazy evaluation — это стратегия вычислений, при которой вычисления откладываются до тех пор, пока результат не станет действительно необходимым. Это позволяет оптимизировать производительность и ресурсоемкость программы, избегая ненужных вычислений.

Ленивые вычисления могут быть реализованы с использованием различных подходов, таких как отложенное вычисление (deferred evaluation), вычисление по требованию (on-demand evaluation) и мемоизация (memoization).

В этом примере вычисления выполняются только при первом обращении к числу Фибоначчи с определенным индексом, после чего результат сохраняется в контейнере memo для последующего использования. Это позволяет избежать повторных вычислений и оптимизировать производительность программы.
Pure virtual function

Pure virtual function (чисто виртуальная функция) — это виртуальная функция, для которой мы можем иметь реализацию, но мы должны переопределить эту функцию в производном классе, иначе производный класс также станет абстрактным классом.
Чисто виртуальная функция объявляется путем присваивания в объявлении.

В этом примере у нас есть абстрактный базовый класс Shape, который содержит чисто виртуальную функцию draw(). Мы не можем создать объект класса Shape, так как он является абстрактным классом.
Затем мы создаем два производных класса Circle и Rectangle, которые переопределяют функцию draw().
В функции main() мы создаем объекты circle и rectangle, а также указатель на базовый класс Shape. Мы устанавливаем указатель на объекты circle и rectangle и вызываем функцию draw() для каждого из них.
Глубокое копирование

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

Это отличается от поверхностного копирования, при котором копируются только значения полей, включая указатели, но не объекты, на которые они указывают.

В этом примере у нас есть класс Deep, который содержит указатель data. В копирующем конструкторе мы создаем новый объект Deep, копируя значение, на которое указывает data в исходном объекте, а не сам указатель.
В функции main мы создаем объект obj1 и затем создаем obj2, используя копирующий конструктор. Затем мы меняем значение, на которое указывает data в obj2, и это не влияет на obj1, что подтверждает, что было выполнено глубокое копирование.
Не отставайте от рынка — учитесь со скидкой 16%

Если чувствуете, что стоите на месте, и хотите освоить востребованную профессию, — сейчас хороший момент начать.

Потому что до 30 сентября на все курсы Практикума действует скидка 16%

Выбрать курс

Вы сможете:

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

Просто выберите курс, начните учиться бесплатно и получите скидку 16% — она автоматически появится в личном кабинете. 

Учиться!

Erid: 2SDnjdsaJNX
Название: ООО "ЯНДЕКС"
ИНН: 7736207543
#вопросы_с_собеседований
Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены?

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

Если исключение выбрасывается из конструктора, то все поля, которые были успешно сконструированы до момента выброса исключения, будут корректно разрушены. Это гарантируется механизмом исключений в C++.

Важно помнить, что только те поля, которые были успешно сконструированы, будут разрушены. Если исключение выбрасывается в процессе конструирования поля, то это поле не будет разрушено, так как его конструктор не был успешно завершен.
Что общего у Алисы, автономного грузовика и поиска лекарств?

Все эти системы требуют сложного бэкенда.

На конференции «Я про бэкенд» 3 октября инженеры расскажут:
— как держать тысячи RPS на генеративных ответах Алисы;
— как обрабатывать 100+ ГБ/с в реальном времени с помощью YTsaurus Flow;
— как сделать агентную платформу надёжной;
— как работать с векторным поиском;
— как переживать отказы дата-центров;
— как обрабатывать до 1200 ГБ данных в час от автономного транспорта. 

А свою backend-задачу, связанную с архитектурой поисковых систем,  можно предложить уже сейчас — самую сложную из них выберут и решат в прямом эфире на конференции

3 октября · Москва + онлайн · бесплатно

Регистрация
constinit

constinit — это новый ключевое слово и спецификатор в C++20. Он используется для объявления переменных со статическим или потоковым временем хранения. Если переменная объявлена с constinit, ее инициализирующее объявление должно быть выполнено с constinit.
Если переменная, объявленная с constinit, имеет динамическую инициализацию (даже если она выполняется как статическая инициализация), программа является некорректной.

constinit гарантирует, что переменная инициализируется на этапе компиляции, и что статическая инициализация не может привести к проблемам с порядком инициализации. Однако он не делает переменную неизменяемой и не подразумевает const или constexpr. Однако constexpr подразумевает constinit.
Переменная может быть одновременно const и constinit, но не может быть одновременно constexpr и constinit.
std::tie

std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргументов или экземпляров std::ignore.

Она может использоваться для распаковки кортежей или пары значений в отдельные переменные. Например, если у вас есть функция, которая возвращает std::pair или std::tuple, вы можете использовать std::tie, чтобы присвоить значения этого кортежа отдельным переменным.

В этом примере мы используем std::tie для распаковки результата вызова set_of_s.insert(value) в две переменные: итератор iter и логическую переменную inserted.
Это позволяет нам проверить, было ли значение успешно вставлено в набор.