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

По вопросам сотрудничества: @adv_and_pr
Download Telegram
Алгоритм 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
➡️ Ответвление с использованием декларации переменной

C++ включает синтаксическое сокращение для одновременного объявления переменной и разветвления по её значению.

Это выглядит как декларация переменной внутри условия оператора if или while, и одновременное присваивание ей значения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Сколько вам лет?
Anonymous Poll
10%
До 18
38%
18-25
22%
25-35
17%
35-45
13%
45+
➡️ Размещающий new

Размещающий new - это альтернативный синтаксис для оператора new, который размещает объект в уже выделенной памяти. Он используется для настройки vtable и вызова конструктора.

Размещающий new полезен для написания кастомных аллокаторов, оптимизирующих производительность. Он позволяет выделить большой блок памяти и последовательно размещать объекты без пробелов, что уменьшает фрагментацию памяти и снижает накладные расходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Злой друг программиста: переопределение ключевых слов

Переопределение ключевых слов — плохая практика программирования, но это возможно через препроцессор. Это может вводить баги, например, #define true false или #define else.

#define int float
#define float char


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

#define public private
#include "mylibrary.h"
#undef private


Это позволяет управлять доступом к библиотеке без её изменения, но требует осторожности.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Lambda-функции и их использование

Lambda-функции — это мощный инструмент в C++, позволяющий определять анонимные функции прямо в месте их использования.

Они особенно полезны для создания компактного и читаемого кода, например, при работе с алгоритмами из стандартной библиотеки (STL).
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Строго типизированные перечисления

Типобезопасные перечисления, которые решают множество проблем с C-перечислениями, включая неявные преобразования, арифметические операции, невозможность указать базовый тип, загрязнение области видимости и т.д.
Please open Telegram to view this post
VIEW IN TELEGRAM