Шаблон Voodoo
Шаблон Voodoo — это шаблон проектирования, который используется для связывания объектов во время выполнения программы.
Шаблон довольно гибкий и позволяет создавать сложные отношения между объектами.
Один объект выступает в роли родительского, остальные — в роли детей. Дети могут обращаться к родителю, но не наоборот. Связи между объектами устанавливаются динамически во время выполнения программы.
#это_база
Шаблон Voodoo — это шаблон проектирования, который используется для связывания объектов во время выполнения программы.
Шаблон довольно гибкий и позволяет создавать сложные отношения между объектами.
Voodoo использует композицию объектов вместо наследования. Объекты связываются друг с другом через указатели или ссылки.Один объект выступает в роли родительского, остальные — в роли детей. Дети могут обращаться к родителю, но не наоборот. Связи между объектами устанавливаются динамически во время выполнения программы.
#это_база
Алгоритм find_if_not
Алгоритм 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 — это ключевые слова, которые используются для реализации корутин (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 — это перечисление, введенное в C++20 для упорядочения значений.
Оно может принимать одно из трех значений:
—
std::partial_ordering::less — первое значение меньше второго.—
std::partial_ordering::equivalent — значения эквивалентны.—
std::partial_ordering::greater — первое значение больше второго.Это позволяет реализовывать трехзначное сравнение, когда не все значения можно однозначно упорядочить.
std::partial_ordering часто используется в качестве возвращаемого значения от операторов сравнения (operator<=>, operator< и т.д.). Также применяется в алгоритмах сортировки, поиска, структурах данных, основанных на сравнении.
#вопросы_с_собеседований
Какие методы являются стандартными для класса?
К стандартным методам класса в C++ относятся:
— Конструкторы и деструктор: используются для создания и уничтожения объектов класса соответственно.
— Операторы присваивания: для копирования и перемещения объектов.
— Геттеры и сеттеры: для доступа к данным класса.
— Операторы сравнения: для сравнения объектов класса на равенство/неравенство.
— Операторы приведения типов: для неявного и явного преобразования типа.
Какие методы являются стандартными для класса?
— Конструкторы и деструктор: используются для создания и уничтожения объектов класса соответственно.
— Операторы присваивания: для копирования и перемещения объектов.
— Геттеры и сеттеры: для доступа к данным класса.
— Операторы сравнения: для сравнения объектов класса на равенство/неравенство.
— Операторы приведения типов: для неявного и явного преобразования типа.
#вопросы_с_собеседований
Как соотносится класс и объект?
Класс и объект в C++ соотносятся как проект чего-либо и его конкретная реализация.
То есть, класс — это описание, а объект — реальная сущность.
Если говорить подробнее, то класс — это как бы "чертеж", который описывает структуру объекта, его данные и поведение. В классе определяются поля данных, методы, конструкторы и другие члены. Но сам по себе класс — это лишь абстракция, своего рода тип данных.
Объект же представляет конкретный экземпляр класса, созданный в памяти программы. При создании объекта выделяется память, в которой хранятся его данные, и этот объект уже может использовать методы класса для работы с этими данными.
Как соотносится класс и объект?
То есть, класс — это описание, а объект — реальная сущность.
Если говорить подробнее, то класс — это как бы "чертеж", который описывает структуру объекта, его данные и поведение. В классе определяются поля данных, методы, конструкторы и другие члены. Но сам по себе класс — это лишь абстракция, своего рода тип данных.
Объект же представляет конкретный экземпляр класса, созданный в памяти программы. При создании объекта выделяется память, в которой хранятся его данные, и этот объект уже может использовать методы класса для работы с этими данными.
Алгоритм compare
Алгоритм compare — это стандартный алгоритм из библиотеки algorithm, который сравнивает два объекта или значения и возвращает результат сравнения.
Он принимает три параметра:
#это_база
Алгоритм compare — это стандартный алгоритм из библиотеки algorithm, который сравнивает два объекта или значения и возвращает результат сравнения.
Он принимает три параметра:
first — первый объект или значение для сравнения.second — второй объект или значение для сравнения.comp — функция сравнения, по умолчанию less<T>, которая возвращает true, если first меньше second.Compare позволяет легко сравнивать объекты, для которых определен оператор <.#это_база
Алгоритм prev_permutation
Алгоритм prev_permutation — это стандартный алгоритм из заголовочного файла algorithm, который трансформирует диапазон элементов в предыдущую лексикографическую перестановку (переставляет элементы в обратном порядке).
Он принимает два параметра:
— Бидирекциональный итератор на начало диапазона элементов.
— Бидирекциональный итератор на конец диапазона элементов.
Алгоритм меняет порядок элементов на предыдущую возможную перестановку в лексикографическом порядке.
Если предыдущей перестановки не существует, то элементы остаются неизменными, а алгоритм возвращает
#это_база
Алгоритм prev_permutation — это стандартный алгоритм из заголовочного файла algorithm, который трансформирует диапазон элементов в предыдущую лексикографическую перестановку (переставляет элементы в обратном порядке).
Он принимает два параметра:
— Бидирекциональный итератор на начало диапазона элементов.
— Бидирекциональный итератор на конец диапазона элементов.
Алгоритм меняет порядок элементов на предыдущую возможную перестановку в лексикографическом порядке.
Если предыдущей перестановки не существует, то элементы остаются неизменными, а алгоритм возвращает
false.#это_база
std::strong_ordering
std::strong_ordering — это перечисление, введенное в C++20 для упорядочения элементов. Оно используется в алгоритмах сравнения, например
Возможные значения:
В примере мы сравниваем две строки
В зависимости от результата выводим сообщение о том, какая строка идет раньше.
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 — это перечисление, введенное в C++20 как упрощенная версия std::strong_ordering. Оно также используется для упорядочивания элементов в алгоритмах сравнения.
Возможные значения:
std::weak_ordering::less — первый элемент меньше второго.std::weak_ordering::equivalent — элементы эквивалентны.std::weak_ordering::greater — первый элемент больше второго.Отличие от
std::strong_ordering в том, что здесь нет значения равенства, вместо него используется эквивалентность.std::weak_ordering часто используется, когда не важно различие между строгим равенством и эквивалентностью.#вопросы_с_собеседований
Как обрабатывается константность переменных?
Константные переменные инициализируются при объявлении и их значение не может быть изменено в течение выполнения программы.
Это позволяет защитить значение переменной от случайного изменения.
Компилятор проверяет использование константных переменных и выдает ошибку, если код пытается модифицировать значение константной переменной после инициализации.
Константность также может быть применена к объектам и функциям, предотвращая изменение состояния объекта или параметров функции.
Использование const делает код более безопасным и понятным, явно указывая на неизменяемость данных.
Как обрабатывается константность переменных?
Это позволяет защитить значение переменной от случайного изменения.
Компилятор проверяет использование константных переменных и выдает ошибку, если код пытается модифицировать значение константной переменной после инициализации.
Константность также может быть применена к объектам и функциям, предотвращая изменение состояния объекта или параметров функции.
Использование const делает код более безопасным и понятным, явно указывая на неизменяемость данных.
#вопросы_с_собеседований
Для чего используют выравнивания, можно ли их контролировать?
Выравнивания в C++ используются для контроля расположения данных в памяти.
Существует несколько видов выравнивания:
— Выравнивание по границе: данные располагаются по определенному адресу кратному размеру типа данных (например, int выравнивается по 4 байта).
— Выравнивание по указателю: указатели имеют выравнивание, соответствующее разрядности процессора.
— Выравнивание структур и классов: поля структур могут иметь выравнивание, зависящее от их типа.
Выравнивание повышает производительность за счет ускорения доступа к данным. Оптимальное выравнивание зависит от архитектуры.
Компилятор оптимизирует выравнивание по умолчанию. Помимо этого, программист может явно указать выравнивание с помощью атрибутов выравнивания.
Для чего используют выравнивания, можно ли их контролировать?
Существует несколько видов выравнивания:
— Выравнивание по границе: данные располагаются по определенному адресу кратному размеру типа данных (например, int выравнивается по 4 байта).
— Выравнивание по указателю: указатели имеют выравнивание, соответствующее разрядности процессора.
— Выравнивание структур и классов: поля структур могут иметь выравнивание, зависящее от их типа.
Выравнивание повышает производительность за счет ускорения доступа к данным. Оптимальное выравнивание зависит от архитектуры.
Компилятор оптимизирует выравнивание по умолчанию. Помимо этого, программист может явно указать выравнивание с помощью атрибутов выравнивания.
Отличия перегрузки оператора от перегрузки функций
— Перегрузка операторов позволяет определить поведение встроенных операторов (+, -, *, / и т. д.) для пользовательских типов данных.
— Перегрузка функций позволяет определить несколько функций с одинаковым именем, но разными параметрами.
Перегрузка операторов определяется внутри класса, а перегрузка функций — вне класса.
Перегруженные операторы могут быть как членами класса, так и глобальными функциями. Перегруженные функции могут быть только глобальными.
#это_база
— Перегрузка операторов позволяет определить поведение встроенных операторов (+, -, *, / и т. д.) для пользовательских типов данных.
— Перегрузка функций позволяет определить несколько функций с одинаковым именем, но разными параметрами.
Перегрузка операторов определяется внутри класса, а перегрузка функций — вне класса.
Перегруженные операторы могут быть как членами класса, так и глобальными функциями. Перегруженные функции могут быть только глобальными.
#это_база
Метод crbegin
Метод crbegin() возвращает итератор на обратный конец контейнера, то есть на элемент перед началом контейнера.
Он определен для стандартных контейнеров в C++, таких как
Итератор
Для получения итератора на начало в обратном направлении используется метод
Методы
#это_база
Метод crbegin() возвращает итератор на обратный конец контейнера, то есть на элемент перед началом контейнера.
Он определен для стандартных контейнеров в C++, таких как
std::vector, std::list, std::deque и другие.Итератор
crbegin() итерирует элементы контейнера в обратном порядке — от конца к началу.Для получения итератора на начало в обратном направлении используется метод
crend().Методы
crbegin() и crend() аналогичны методам rbegin() и rend(), но возвращают константные итераторы для константных контейнеров.#это_база
spaceship operator
Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.
Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например
— Читабельнее и компактнее кода с традиционными операторами сравнения.
Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.
Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например
std::sort.— Читабельнее и компактнее кода с традиционными операторами сравнения.
using-декларации
Using-декларации используются для импорта имен в текущую область видимости.
Они позволяют избежать необходимости квалифицировать имена из других пространств имен при использовании.
Основные моменты о using-декларациях:
— Позволяют импортировать отдельные имена, например классы, функции или константы.
— Могут применяться как внутри блоков кода, так и вне их. Вне блоков имена импортируются в глобальную область видимости.
— Не импортируют всё пространство имен целиком, в отличие от директив
— Помогают избежать конфликтов имен из разных пространств.
Using-декларации используются для импорта имен в текущую область видимости.
Они позволяют избежать необходимости квалифицировать имена из других пространств имен при использовании.
Основные моменты о using-декларациях:
— Позволяют импортировать отдельные имена, например классы, функции или константы.
— Могут применяться как внутри блоков кода, так и вне их. Вне блоков имена импортируются в глобальную область видимости.
— Не импортируют всё пространство имен целиком, в отличие от директив
using namespace.— Помогают избежать конфликтов имен из разных пространств.
#вопросы_с_собеседований
Как расширить STL-контейнеры?
— Создать собственный контейнер, реализовав нужные интерфейсы. Это позволит использовать его с алгоритмами STL.
— Наследоваться от существующих контейнеров и добавить нужный функционал.
— Создать обертку (wrapper) вокруг std контейнера, добавляя в нее нужные методы и функциональность.
— Использовать политику (policy-based design), определяя класс-политику, который будет кастомизировать поведение контейнера.
— Для ассоциативных контейнеров, таких как std::map, можно определить собственный компаратор (compare) для кастомной сортировки.
— Реализовать собственные аллокаторы памяти, если нужно изменить стратегию выделения памяти для контейнера.
Как расширить STL-контейнеры?
— Наследоваться от существующих контейнеров и добавить нужный функционал.
— Создать обертку (wrapper) вокруг std контейнера, добавляя в нее нужные методы и функциональность.
— Использовать политику (policy-based design), определяя класс-политику, который будет кастомизировать поведение контейнера.
— Для ассоциативных контейнеров, таких как std::map, можно определить собственный компаратор (compare) для кастомной сортировки.
— Реализовать собственные аллокаторы памяти, если нужно изменить стратегию выделения памяти для контейнера.
Ссылки
Ссылки - это альтернативные имена для существующих переменных. Переменная может быть объявлена как ссылка, используя символ &.
Ссылка может быть определена как тип переменной, который может действовать как ссылка на другую переменную.
Символ & используется для обозначения адреса переменной или любой памяти. Переменные, связанные со ссылочными переменными, могут быть доступны как по имени, так и по ссылочной переменной, связанной с ними.
#это_база
Ссылки - это альтернативные имена для существующих переменных. Переменная может быть объявлена как ссылка, используя символ &.
Ссылка может быть определена как тип переменной, который может действовать как ссылка на другую переменную.
Символ & используется для обозначения адреса переменной или любой памяти. Переменные, связанные со ссылочными переменными, могут быть доступны как по имени, так и по ссылочной переменной, связанной с ними.
#это_база
#вопросы_с_собеседований
Чем отличается мьютекс от семафора?
— Семафор может принимать любое неотрицательное целое значение, мьютекс — только 0 или 1.
— Семафор используется для синхронизации потоков и ограничения доступа к общим ресурсам. Мьютекс — только для взаимного исключения потоков.
— Операции с семафором: wait/signal. С мьютексом: lock/unlock.
— Ожидание семафора можно прервать. Блокировка мьютекса — непрерывная.
— Семафоры можно использовать для реализации ограниченных ресурсов, счетчиков, барьеров. Мьютексы — только для взаимного исключения.
— Мьютекс может быть рекурсивным, семафор — нет.
— Использование семафора часто требует больше кода и аккуратности чем мьютекса.
Чем отличается мьютекс от семафора?
— Семафор используется для синхронизации потоков и ограничения доступа к общим ресурсам. Мьютекс — только для взаимного исключения потоков.
— Операции с семафором: wait/signal. С мьютексом: lock/unlock.
— Ожидание семафора можно прервать. Блокировка мьютекса — непрерывная.
— Семафоры можно использовать для реализации ограниченных ресурсов, счетчиков, барьеров. Мьютексы — только для взаимного исключения.
— Мьютекс может быть рекурсивным, семафор — нет.
— Использование семафора часто требует больше кода и аккуратности чем мьютекса.
Метод map::emplace_hint
Метод map::emplace_hint — это оптимизированный способ вставки элемента в ассоциативный контейнер std::map.
Он позволяет конструировать объект прямо в памяти контейнера, избегая лишних копирований.
Метод принимает хинт — итератор, указывающий приблизительное место вставки, использует его для оптимизации поиска нужного места вставки. Затем возвращает пару (итератор на вставленный элемент, флаг успешности вставки).
#это_база
Метод map::emplace_hint — это оптимизированный способ вставки элемента в ассоциативный контейнер std::map.
Он позволяет конструировать объект прямо в памяти контейнера, избегая лишних копирований.
Метод принимает хинт — итератор, указывающий приблизительное место вставки, использует его для оптимизации поиска нужного места вставки. Затем возвращает пару (итератор на вставленный элемент, флаг успешности вставки).
#это_база
isalpha()
Функция isalpha() проверяет, является ли символ буквой. Она определена в заголовочном файле
Функция принимает символ как аргумент и возвращает логическое значение —
Может распознавать как строчные, так и прописные буквы.
#это_база
Функция isalpha() проверяет, является ли символ буквой. Она определена в заголовочном файле
<ctype.h>.Функция принимает символ как аргумент и возвращает логическое значение —
true, если символ является буквой латинского алфавита и false — для небуквенных символов.Может распознавать как строчные, так и прописные буквы.
#это_база