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
Алгоритм 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 — для небуквенных символов.
Может распознавать как строчные, так и прописные буквы.

#это_база
Спецификатор доступа default

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

Если при объявлении члена класса не указан спецификатор (public, private, protected), по умолчанию считается default.

В примере x объявлен без спецификатора доступа, значит его видимость по умолчанию — private. А y явно помечен как public и доступен извне класса.
Таким образом, default позволяет не писать лишний private при объявлении членов класса.