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

Mismatch — это алгоритм из стандартной библиотеки, который сравнивает два диапазона и возвращает итераторы на первые несовпадающие элементы.

Он принимает 4 параметра:
— Итераторы на начало двух диапазонов для сравнения.
— Итераторы на конец этих диапазонов.
— Бинарный предикат для сравнения элементов (по умолчанию используется оператор ==).

Алгоритм идет по двум диапазонам параллельно и сравнивает элементы с помощью предиката. Как только элементы не совпадут, алгоритм вернет пару итераторов на эти элементы.
Если диапазоны закончились, а элементы так и не отличились, то возвращаются итераторы на конец диапазонов.

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

#это_база
is_sorted_until

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

Алгоритм принимает 3 параметра:
— Итератор на начало проверяемого диапазона.
— Итератор на конец диапазона.
— Компаратор для сравнения элементов (по умолчанию less).

Алгоритм идет по диапазону от начала к концу и сравнивает каждый элемент с предыдущим с помощью компаратора.
Если нарушения порядка не найдено, возвращается итератор на конец диапазона. Иначе возвращается итератор на первый нарушающий элемент.

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

#это_база
Библиотека концепций

Библиотека концепций (concepts library) — это новая библиотека, добавленная в C++20 для работы с концепциями.

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

Концепции используются для:
— Проверки корректности типов в шаблонах функций и классов.
— Ограничения диапазона допустимых типов.
— Улучшения сообщений об ошибках компиляции.
— Возможности оптимизации кода компилятором.

В примере концепция equality_comparable используется для проверки, что тип T поддерживает операцию ==, необходимую для сортировки. Это позволяет выявить ошибку на этапе компиляции.
std::size_t

std::size_t — это тип данных без знака, предназначенный для хранения размера объектов в памяти.
Он определен в заголовочном файле <cstddef> и обычно представлен как unsigned int или unsigned long в зависимости от платформы.

std::size_t используется для:
— Представления индексов массивов и размеров контейнеров в стандартной библиотеке.
— Возврата значений размера из функций, например size(), length().
— Указания размера при выделении памяти.
— Предотвращения переполнения при вычислениях размеров.

std::size_t гарантирует достаточный диапазон значений для адресации всей доступной памяти.
#вопросы_с_собеседований
Какая разница между calloc и malloc?

Основное различие между функциями calloc и malloc заключается в том, как они инициализируют выделенную память.

malloc просто выделяет указанный объем памяти и возвращает указатель на него. Содержимое выделенной памяти при этом не инициализируется.
calloc, помимо выделения памяти, также инициализирует всю выделенную память нулями. Таким образом после вызова calloc вся выделенная память будет заполнена нулевыми значениями.

Кроме того, в calloc размер выделяемой памяти задается в элементах, а не в байтах. Calloc умножает количество элементов на размер одного элемента, чтобы определить общий размер памяти для выделения.
#вопросы_с_собеседований
Что такое список инициализации?

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

Преимущества списка инициализации:
— Переменная всегда инициализирована, нет возможности использовать неинициализированную переменную.
— Компилятор может выполнить оптимизации, т. к. знает значение переменной при инициализации.
— При инициализации классов вызываются нужные конструкторы.
— Код становится более читабельным, инициализация видна сразу при объявлении.
Алгоритм 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.
В зависимости от результата выводим сообщение о том, какая строка идет раньше.