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
Алгоритм lower_bound

Алгоритм lower_bound — это алгоритм поиска в отсортированном массиве или контейнере элемента, который не меньше заданного значения.

lower_bound возвращает итератор на первый элемент в диапазоне, который не меньше заданного значения. Если подходящий элемент не найден, возвращается итератор на конец диапазона.
При этом массив или контейнер должен быть отсортирован.

Алгоритм имеет логарифмическую сложность O(log n).
Может применяться для поиска элемента или вставки нового элемента в отсортированный массив

#это_база
Пространство имен

Пространства имен позволяют группировать объекты (классы, функции, переменные) под общим уникальным именем.
Это избавляет от конфликтов имен при использовании кода из разных библиотек.

Пространства имен объявляются конструкцией namespace, а чтобы использовать объект из пространства имен, нужно указывать полное имя с именем пространства.
Чтобы не писать префикс каждый раз можно импортировать пространство имен в начале файла.

#это_база
requires-expression

Requires-выражение в С++20 позволяет задавать требования к типам параметров шаблонов.
Это дает возможность выполнять проверку типов во время компиляции и позволяет создавать перегруженные шаблоны функций и классов с разными требованиями к типам.

Requires-expressions помогают создавать более гибкие и безопасные шаблоны, улучшают читаемость кода и помогают компилятору генерировать более качественные сообщения об ошибках.

В примере для каждой перегрузки функции add используется requires-выражение, которое накладывает ограничения на тип параметра T.
Это позволяет компилятору выбрать нужную перегрузку в зависимости от типа аргументов.
requires clause

requires clause в С++20 — это новый синтаксис для задания требований к шаблонам, альтернативный requires-выражениям.

requires clause позволяет задавать требования к типам непосредственно при объявлении шаблона. Это делает код более читабельным и понятным.

Requires clause применяется для:
— Проверки наличия определенных возможностей у типов-параметров шаблонов.
— Ограничения допустимых типов-параметров.
— Условного компилирования шаблонов в зависимости от типов.

В примере requires clause гарантирует, что функция add будет работать только с целочисленными типами.
Это делает намерения программиста явными и позволяет лучше контролировать вызовы шаблона.
#вопросы_с_собеседований
Какие есть способы инициализации полей класса?

В C++ есть несколько способов инициализации полей класса:

Конструктор: в конструкторе класса можно присвоить начальные значения полям.

Инициализаторы: можно задать начальные значения для полей непосредственно при их объявлении в классе.

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

Значения по умолчанию: для базовых типов компилятор сам присвоит значения по умолчанию, если не указано иное.

Статическая инициализация: для статических полей класса можно задать начальное значение непосредственно при объявлении.

Каждый из этих способов имеет свои особенности и подходит для разных случаев инициализации полей класса.
#вопросы_с_собеседований
Что такое "идиома remove-erase"?

Идиома remove-erase — это распространенный прием работы с контейнерами, позволяющий эффективно удалять элементы, соответствующие некоторому условию.

Суть идиомы заключается в следующем:

1. С помощью алгоритма std::remove или std::remove_if элементы, подлежащие удалению, перемещаются в конец контейнера.
2. Затем с помощью метода erase удаляется диапазон элементов от нового конца контейнера до старого, содержащий элементы для удаления.
3. Такой подход позволяет избежать лишних копирований, так как при удалении с помощью erase порядок оставшихся элементов сохраняется.

Эта идиома часто используется для эффективного удаления элементов из вектора или других последовательных контейнеров.
Шаблон 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.
— Читабельнее и компактнее кода с традиционными операторами сравнения.