Senior C++ Developer
12.9K subscribers
1.29K photos
3 videos
587 links
№ 4931128893
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr
Download Telegram
Генерация случайных числе в C++

Чтобы сгенерировать случайное число используется функция rand(), которая размещается в библиотечном файле stdlib.h.

Функция возвращает случайное целочисленное значение, которое лежит в пределах от 0 до 32767.
Бьерн Страуструп: Почему я создал C++ (перевод)

Перевод интервью с Бьерном Страуструпом 2011 года, в котором он рассказывает как и почему он пришел к созданию языка программирования C++.

Смотреть видео
move constructor

Move-конструктор — это специальный конструктор, который позволяет эффективно перемещать ресурсы из одного объекта в другой, без необходимости копирования данных.
Он используется для реализации семантики перемещения (move semantics) и оптимизации работы с временными объектами.

Move-конструктор принимает rvalue ссылку (&&) на объект, который будет перемещен, и выполняет простое копирование указателей на данные, а не их фактическое копирование.

Использование move-конструктора позволяет избежать лишних копирований данных и повысить производительность при работе с большими или ресурсоемкими объектами.
Понимаем обычное дерево отрезков

Пусть у нас есть задача: поступают запросы двух видов для исходного массива. Первый вид - это замена конкретного элемента на другой. Второй - вычисление суммы/минимума или другой операции на диапазоне. Требуется обработать эти запросы.

Дерево отрезков решает эту задачу и позволяет обновить элемент, и дать ответ по диапазону за логарифмическое время O(logN). Сама структура данных строится за линейное время O(N). Затраты по памяти - 4N. Почему это так рассмотрим в конце статьи.

Смотреть статью
Алгоритм distance

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

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

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

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

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

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

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

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

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

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

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

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.
Различие локальной переменной и поля класса с одинаковым именем

Указатель this может быть полезен в случае, когда локальная переменная в методе имеет то же самое имя, что и поле объекта:

void set(int x) { this->x = x; }

Здесь в методе set мы присваиваем полю класса x значение локальной переменной this. Чтобы различить поле класса x и локальную переменную с тем же именем мы используем запись this->x при обращении к полю класса.
#вопросы_с_собеседований
Что случится, если exception выйдет за пределы потока?

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

Чтобы избежать данной ситуации, необходимо обернуть код, где может возникнуть исключение, в try-catch блок на том же уровне, что и поток, с которым он связан.
execution policy для параллельных алгоритмов

Execution policy в C++ - это новшество, введенное в стандарте языка C++17. Это механизм, который позволяет выбрать, как именно должны выполняться алгоритмы в стандартной библиотеке: последовательно или параллельно.

Существуют три варианта execution policy:

- seq: выполняет алгоритм последовательно.
- par: выполняет алгоритм параллельно, используя все доступные ядра процессора.
- par_unseq: выполняет алгоритм параллельно и может использовать неупорядоченное исполнение.

Execution policy может быть использован в комбинации с многими алгоритмами в стандартной библиотеке, такими как std::for_each, std::transform, std::reduce и другими. Например, код выше выполняет алгоритм std::for_each параллельно.
Проверить, найден ли элемент в массиве С++

В С++ вы должны использовать std::find и проверить, указывает ли результирующий указатель на конец диапазона.
#вопросы_с_собеседований
➡️ Перегрузка ++ и --

В C++ имя функции пользовательских операторов — это сам символ оператора.
Унарные и бинарные операторы (- и -) различаются по количеству аргументов.
Унарные операторы инкремента и декремента (++, --) имеют одинаковую сигнатуру.
Для различия постфиксных операторов ++ и -- используется фиктивный аргумент int.
Постфиксные операторы ++ и -- принимают фиктивный аргумент int как флаг для компилятора.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Static methods on instances

C++ позволяет вызывать статические методы из экземпляра таким же образом, как и из класса.

Это позволяет изменять нестатические методы экземпляра на статические без необходимости обновления записи вызова функции.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Перегрузка операторов и порядок вычисления

Перегрузка операторов , (запятая), || (логическое ИЛИ), и && (логическое И) сбивает с толку.
Оператор «запятая» обычно гарантирует, что левая сторона вычисляется до правой.
Операторы || и && обычно вычисляют правую сторону только при необходимости.
Перегруженные версии этих операторов — это вызовы функций, которые вычисляются в неопределенном порядке.
Перегрузка этих операторов может привести к некорректному использованию синтаксиса C++.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Квалификаторы ссылки в методах

C++11 позволяет перегружать методы с использованием квалификатора ссылки, который находится в той же позиции, что и cv-квалификаторы (const и volatile квалификаторы).

Это влияет на то, какой метод будет вызван для объекта, в зависимости от типа this, – является ли он lvalue или же rvalue.
Please open Telegram to view this post
VIEW IN TELEGRAM