Senior C++ Developer – Telegram
Senior C++ Developer
12.3K subscribers
1.36K photos
3 videos
609 links
Изучаем C++.

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

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
Шаблон Voodoo

Шаблон Voodoo — это шаблон проектирования, который используется для связывания объектов во время выполнения программы.
Шаблон довольно гибкий и позволяет создавать сложные отношения между объектами.

Voodoo использует композицию объектов вместо наследования. Объекты связываются друг с другом через указатели или ссылки.
Один объект выступает в роли родительского, остальные — в роли детей. Дети могут обращаться к родителю, но не наоборот. Связи между объектами устанавливаются динамически во время выполнения программы.

#это_база
Алгоритм find_if_not

Алгоритм find_if_not — это алгоритм поиска в диапазоне, который ищет первый элемент, НЕ удовлетворяющий условию.
Он принимает начало и конец диапазона, а также унарный предикат (условие), возвращает итератор на первый найденный элемент, не соответствующий предикату. Если такого элемента нет — возвращает итератор на конец диапазона.

Алгоритм работает с разными типами контейнеров, поддерживающих итераторы.

#это_база
co_await, co_yield и co_return

co_await, co_yield и co_return — это ключевые слова, которые используются для реализации корутин (coroutines).

co_await используется для приостановки корутины и ожидания результата асинхронной операции.

co_yield используется для приостановки корутины и передачи управления обратно вызывающему коду.

co_return используется для завершения корутины и возврата результата.

В этом примере используются все три ключевых слова:
co_await приостанавливает корутину create_task в начале.
co_yield можно было бы использовать для дополнительных приостановок.
co_return завершает корутину в конце.
std::partial_ordering

std::partial_ordering — это перечисление, введенное в C++20 для упорядочения значений.

Оно может принимать одно из трех значений:
std::partial_ordering::less — первое значение меньше второго.
std::partial_ordering::equivalent — значения эквивалентны.
std::partial_ordering::greater — первое значение больше второго.

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

std::partial_ordering часто используется в качестве возвращаемого значения от операторов сравнения (operator<=>, operator< и т.д.).
Также применяется в алгоритмах сортировки, поиска, структурах данных, основанных на сравнении.
#вопросы_с_собеседований
Какие методы являются стандартными для класса?

К стандартным методам класса в C++ относятся:

— Конструкторы и деструктор: используются для создания и уничтожения объектов класса соответственно.

— Операторы присваивания: для копирования и перемещения объектов.

— Геттеры и сеттеры: для доступа к данным класса.

— Операторы сравнения: для сравнения объектов класса на равенство/неравенство.

— Операторы приведения типов: для неявного и явного преобразования типа.
#вопросы_с_собеседований
Как соотносится класс и объект?

Класс и объект в C++ соотносятся как проект чего-либо и его конкретная реализация.
То есть, класс — это описание, а объект — реальная сущность.

Если говорить подробнее, то класс — это как бы "чертеж", который описывает структуру объекта, его данные и поведение. В классе определяются поля данных, методы, конструкторы и другие члены. Но сам по себе класс — это лишь абстракция, своего рода тип данных.

Объект же представляет конкретный экземпляр класса, созданный в памяти программы. При создании объекта выделяется память, в которой хранятся его данные, и этот объект уже может использовать методы класса для работы с этими данными.
Алгоритм compare

Алгоритм compare — это стандартный алгоритм из библиотеки algorithm, который сравнивает два объекта или значения и возвращает результат сравнения.

Он принимает три параметра:
first — первый объект или значение для сравнения.
second — второй объект или значение для сравнения.
comp — функция сравнения, по умолчанию less<T>, которая возвращает true, если first меньше second.

Compare позволяет легко сравнивать объекты, для которых определен оператор <.

#это_база
Алгоритм prev_permutation

Алгоритм prev_permutation — это стандартный алгоритм из заголовочного файла algorithm, который трансформирует диапазон элементов в предыдущую лексикографическую перестановку (переставляет элементы в обратном порядке).

Он принимает два параметра:
— Бидирекциональный итератор на начало диапазона элементов.
— Бидирекциональный итератор на конец диапазона элементов.

Алгоритм меняет порядок элементов на предыдущую возможную перестановку в лексикографическом порядке.

Если предыдущей перестановки не существует, то элементы остаются неизменными, а алгоритм возвращает false.

#это_база
std::strong_ordering

std::strong_ordering — это перечисление, введенное в C++20 для упорядочения элементов. Оно используется в алгоритмах сравнения, например std::sort, для определения порядка элементов.

Возможные значения:
std::strong_ordering::less — первый элемент меньше второго.
std::strong_ordering::equal — элементы равны.
std::strong_ordering::greater — первый элемент больше второго.

В примере мы сравниваем две строки s1 и s2 с помощью метода compare(), который возвращает std::strong_ordering.
В зависимости от результата выводим сообщение о том, какая строка идет раньше.
std::weak_ordering

std::weak_ordering — это перечисление, введенное в C++20 как упрощенная версия std::strong_ordering. Оно также используется для упорядочивания элементов в алгоритмах сравнения.

Возможные значения:
std::weak_ordering::less — первый элемент меньше второго.
std::weak_ordering::equivalent — элементы эквивалентны.
std::weak_ordering::greater — первый элемент больше второго.

Отличие от std::strong_ordering в том, что здесь нет значения равенства, вместо него используется эквивалентность.

std::weak_ordering часто используется, когда не важно различие между строгим равенством и эквивалентностью.
#вопросы_с_собеседований
Как обрабатывается константность переменных?

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

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

Использование const делает код более безопасным и понятным, явно указывая на неизменяемость данных.
#вопросы_с_собеседований
Для чего используют выравнивания, можно ли их контролировать?

Выравнивания в C++ используются для контроля расположения данных в памяти.

Существует несколько видов выравнивания:
— Выравнивание по границе: данные располагаются по определенному адресу кратному размеру типа данных (например, int выравнивается по 4 байта).
— Выравнивание по указателю: указатели имеют выравнивание, соответствующее разрядности процессора.
— Выравнивание структур и классов: поля структур могут иметь выравнивание, зависящее от их типа.

Выравнивание повышает производительность за счет ускорения доступа к данным. Оптимальное выравнивание зависит от архитектуры.

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

Перегрузка операторов позволяет определить поведение встроенных операторов (+, -, *, / и т. д.) для пользовательских типов данных.
— Перегрузка функций позволяет определить несколько функций с одинаковым именем, но разными параметрами.

Перегрузка операторов определяется внутри класса, а перегрузка функций — вне класса.

Перегруженные операторы могут быть как членами класса, так и глобальными функциями. Перегруженные функции могут быть только глобальными.

#это_база
Метод crbegin

Метод crbegin() возвращает итератор на обратный конец контейнера, то есть на элемент перед началом контейнера.
Он определен для стандартных контейнеров в C++, таких как std::vector, std::list, std::deque и другие.

Итератор crbegin() итерирует элементы контейнера в обратном порядке — от конца к началу.
Для получения итератора на начало в обратном направлении используется метод crend().

Методы crbegin() и crend() аналогичны методам rbegin() и rend(), но возвращают константные итераторы для константных контейнеров.

#это_база
spaceship operator

Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.

Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например std::sort.
— Читабельнее и компактнее кода с традиционными операторами сравнения.
using-декларации

Using-декларации используются для импорта имен в текущую область видимости.
Они позволяют избежать необходимости квалифицировать имена из других пространств имен при использовании.

Основные моменты о using-декларациях:

— Позволяют импортировать отдельные имена, например классы, функции или константы.
— Могут применяться как внутри блоков кода, так и вне их. Вне блоков имена импортируются в глобальную область видимости.
— Не импортируют всё пространство имен целиком, в отличие от директив using namespace.
— Помогают избежать конфликтов имен из разных пространств.
#вопросы_с_собеседований
Как расширить STL-контейнеры?

— Создать собственный контейнер, реализовав нужные интерфейсы. Это позволит использовать его с алгоритмами STL.

— Наследоваться от существующих контейнеров и добавить нужный функционал.

— Создать обертку (wrapper) вокруг std контейнера, добавляя в нее нужные методы и функциональность.

— Использовать политику (policy-based design), определяя класс-политику, который будет кастомизировать поведение контейнера.

— Для ассоциативных контейнеров, таких как std::map, можно определить собственный компаратор (compare) для кастомной сортировки.

— Реализовать собственные аллокаторы памяти, если нужно изменить стратегию выделения памяти для контейнера.
Ссылки

Ссылки
- это альтернативные имена для существующих переменных. Переменная может быть объявлена как ссылка, используя символ &.
Ссылка может быть определена как тип переменной, который может действовать как ссылка на другую переменную.

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

#это_база
#вопросы_с_собеседований
Чем отличается мьютекс от семафора?

— Семафор может принимать любое неотрицательное целое значение, мьютекс — только 0 или 1.

— Семафор используется для синхронизации потоков и ограничения доступа к общим ресурсам. Мьютекс — только для взаимного исключения потоков.

— Операции с семафором: wait/signal. С мьютексом: lock/unlock.

— Ожидание семафора можно прервать. Блокировка мьютекса — непрерывная.

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

— Мьютекс может быть рекурсивным, семафор — нет.

— Использование семафора часто требует больше кода и аккуратности чем мьютекса.
Метод map::emplace_hint

Метод map::emplace_hint — это оптимизированный способ вставки элемента в ассоциативный контейнер std::map.
Он позволяет конструировать объект прямо в памяти контейнера, избегая лишних копирований.

Метод принимает хинт — итератор, указывающий приблизительное место вставки, использует его для оптимизации поиска нужного места вставки. Затем возвращает пару (итератор на вставленный элемент, флаг успешности вставки).

#это_база
isalpha()

Функция isalpha() проверяет, является ли символ буквой. Она определена в заголовочном файле <ctype.h>.

Функция принимает символ как аргумент и возвращает логическое значение — true, если символ является буквой латинского алфавита и false — для небуквенных символов.
Может распознавать как строчные, так и прописные буквы.

#это_база