std::search
Функция std::search используется для поиска последовательности элементов в другой последовательности. Она находит первое вхождение подпоследовательности элементов в заданной последовательности и возвращает итератор, указывающий на начало этого вхождения, или итератор, указывающий на конец последовательности, если подпоследовательность не найдена.
#для_начинающих
Функция std::search используется для поиска последовательности элементов в другой последовательности. Она находит первое вхождение подпоследовательности элементов в заданной последовательности и возвращает итератор, указывающий на начало этого вхождения, или итератор, указывающий на конец последовательности, если подпоследовательность не найдена.
#для_начинающих
Placement new
Placement new — это специальный оператор, который позволяет создавать объекты в заданной области памяти, вместо выделения новой памяти для объекта. Это полезно, когда вы хотите явно контролировать расположение объектов в памяти, например, при работе с устройствами ввода-вывода или при реализации собственных аллокаторов.
Обратите внимание, что после использования объекта, созданного с помощью placement new, вы должны вызвать его деструктор явно, как показано в примере выше. Это необходимо для правильного освобождения ресурсов и избежания утечек памяти.
#для_продвинутых
Placement new — это специальный оператор, который позволяет создавать объекты в заданной области памяти, вместо выделения новой памяти для объекта. Это полезно, когда вы хотите явно контролировать расположение объектов в памяти, например, при работе с устройствами ввода-вывода или при реализации собственных аллокаторов.
Обратите внимание, что после использования объекта, созданного с помощью placement new, вы должны вызвать его деструктор явно, как показано в примере выше. Это необходимо для правильного освобождения ресурсов и избежания утечек памяти.
#для_продвинутых
Cache miss
Cache miss (промах в кэше) в C++ относится к ситуации, когда процессор не может найти нужные данные в кэше, и должен обратиться к более медленной памяти (например ОЗУ), для получения этих данных.
Когда код выполняется на процессоре, процессор пытается загрузить данные или инструкции из кэша первого, второго или третьего уровня (L1, L2, L3 и так далее), прежде чем обращаться к оперативной памяти. Если данные или инструкции отсутствуют в кэше, возникает кэш-промах (cache miss), и процессор должен загрузить их из оперативной памяти, что занимает гораздо больше времени, чем доступ к данным в кэше.
#для_продвинутых
Cache miss (промах в кэше) в C++ относится к ситуации, когда процессор не может найти нужные данные в кэше, и должен обратиться к более медленной памяти (например ОЗУ), для получения этих данных.
Когда код выполняется на процессоре, процессор пытается загрузить данные или инструкции из кэша первого, второго или третьего уровня (L1, L2, L3 и так далее), прежде чем обращаться к оперативной памяти. Если данные или инструкции отсутствуют в кэше, возникает кэш-промах (cache miss), и процессор должен загрузить их из оперативной памяти, что занимает гораздо больше времени, чем доступ к данным в кэше.
#для_продвинутых
#вопросы_с_собеседований
Что такое список инициализации?
Список инициализации — это способ инициализации переменных, при котором переменные инициализируются прямо в месте их объявления через список инициализаторов в фигурных скобках {}.
При использовании списка инициализации переменные инициализируются сразу при объявлении, а не в отдельном операторе присваивания.
Преимущества списка инициализации:
— Переменная всегда инициализирована, нет возможности использовать неинициализированную переменную.
— Компилятор может выполнить оптимизации, т. к. знает значение переменной при инициализации.
— При инициализации классов вызываются нужные конструкторы.
— Код становится более читабельным, инициализация видна сразу при объявлении.
Что такое список инициализации?
При использовании списка инициализации переменные инициализируются сразу при объявлении, а не в отдельном операторе присваивания.
Преимущества списка инициализации:
— Переменная всегда инициализирована, нет возможности использовать неинициализированную переменную.
— Компилятор может выполнить оптимизации, т. к. знает значение переменной при инициализации.
— При инициализации классов вызываются нужные конструкторы.
— Код становится более читабельным, инициализация видна сразу при объявлении.
#вопросы_с_собеседований
Какая разница между calloc и malloc?
Основное различие между функциями calloc и malloc заключается в том, как они инициализируют выделенную память.
malloc просто выделяет указанный объем памяти и возвращает указатель на него. Содержимое выделенной памяти при этом не инициализируется.
calloc, помимо выделения памяти, также инициализирует всю выделенную память нулями. Таким образом после вызова calloc вся выделенная память будет заполнена нулевыми значениями.
Кроме того, в calloc размер выделяемой памяти задается в элементах, а не в байтах. Calloc умножает количество элементов на размер одного элемента, чтобы определить общий размер памяти для выделения.
Какая разница между calloc и malloc?
malloc просто выделяет указанный объем памяти и возвращает указатель на него. Содержимое выделенной памяти при этом не инициализируется.
calloc, помимо выделения памяти, также инициализирует всю выделенную память нулями. Таким образом после вызова calloc вся выделенная память будет заполнена нулевыми значениями.
Кроме того, в calloc размер выделяемой памяти задается в элементах, а не в байтах. Calloc умножает количество элементов на размер одного элемента, чтобы определить общий размер памяти для выделения.
std::size_t
std::size_t — это тип данных без знака, предназначенный для хранения размера объектов в памяти.
Он определен в заголовочном файле
— Представления индексов массивов и размеров контейнеров в стандартной библиотеке.
— Возврата значений размера из функций, например
— Указания размера при выделении памяти.
— Предотвращения переполнения при вычислениях размеров.
std::size_t — это тип данных без знака, предназначенный для хранения размера объектов в памяти.
Он определен в заголовочном файле
<cstddef>
и обычно представлен как unsigned int
или unsigned long
в зависимости от платформы.std::size_t
используется для:— Представления индексов массивов и размеров контейнеров в стандартной библиотеке.
— Возврата значений размера из функций, например
size()
, length()
.— Указания размера при выделении памяти.
— Предотвращения переполнения при вычислениях размеров.
std::size_t
гарантирует достаточный диапазон значений для адресации всей доступной памяти.Библиотека концепций
Библиотека концепций (concepts library) — это новая библиотека, добавленная в C++20 для работы с концепциями.
Концепции позволяют формально определять требования к типам. Они похожи на шаблоны, но проверяют не только наличие определенных операций, но и семантику этих операций.
Концепции используются для:
— Проверки корректности типов в шаблонах функций и классов.
— Ограничения диапазона допустимых типов.
— Улучшения сообщений об ошибках компиляции.
— Возможности оптимизации кода компилятором.
В примере концепция
Библиотека концепций (concepts library) — это новая библиотека, добавленная в C++20 для работы с концепциями.
Концепции позволяют формально определять требования к типам. Они похожи на шаблоны, но проверяют не только наличие определенных операций, но и семантику этих операций.
Концепции используются для:
— Проверки корректности типов в шаблонах функций и классов.
— Ограничения диапазона допустимых типов.
— Улучшения сообщений об ошибках компиляции.
— Возможности оптимизации кода компилятором.
В примере концепция
equality_comparable
используется для проверки, что тип T
поддерживает операцию ==
, необходимую для сортировки. Это позволяет выявить ошибку на этапе компиляции.Алгоритм lower_bound
Алгоритм lower_bound — это алгоритм поиска в отсортированном массиве или контейнере элемента, который не меньше заданного значения.
При этом массив или контейнер должен быть отсортирован.
Алгоритм имеет логарифмическую сложность O(log n).
Может применяться для поиска элемента или вставки нового элемента в отсортированный массив
#это_база
Алгоритм lower_bound — это алгоритм поиска в отсортированном массиве или контейнере элемента, который не меньше заданного значения.
lower_bound
возвращает итератор на первый элемент в диапазоне, который не меньше заданного значения. Если подходящий элемент не найден, возвращается итератор на конец диапазона.При этом массив или контейнер должен быть отсортирован.
Алгоритм имеет логарифмическую сложность O(log n).
Может применяться для поиска элемента или вставки нового элемента в отсортированный массив
#это_база
msg_ptr (message pointer)
msg_ptr это указатель на структуру или класс, который содержит данные сообщения. Обычно это просто указатель void*.
Он используется в многопоточном программировании для передачи сообщений между потоками.
Использование указателей вместо копирования данных позволяет избежать лишних копий и ускорить передачу сообщений между потоками.
Если запустить код из примера, можно увидеть, что данные успешно передаются между потоками через очередь с использованием указателей на сообщения.
msg_ptr это указатель на структуру или класс, который содержит данные сообщения. Обычно это просто указатель void*.
Он используется в многопоточном программировании для передачи сообщений между потоками.
Использование указателей вместо копирования данных позволяет избежать лишних копий и ускорить передачу сообщений между потоками.
Если запустить код из примера, можно увидеть, что данные успешно передаются между потоками через очередь с использованием указателей на сообщения.
#вопросы_с_собеседований
Что такое union?
Union - это специальный класс, который позволяет хранить данные разных типов в одной области памяти.
Основные характеристики:
- Объявляется с ключевым словом union.
- В каждый момент активно только одно поле.
- Размер равен наибольшему полю.
- Позволяет интерпретировать одну область памяти разными способами.
- Экономит память.
- Доступ к полям как в обычном классе.
Что такое union?
Основные характеристики:
- Объявляется с ключевым словом union.
- В каждый момент активно только одно поле.
- Размер равен наибольшему полю.
- Позволяет интерпретировать одну область памяти разными способами.
- Экономит память.
- Доступ к полям как в обычном классе.
#вопросы_с_собеседований
Что такое рефакторинг?
Рефакторинг - это процесс изменения внутренней структуры программы без изменения ее внешнего поведения.
Рефакторинг кода может применяться в следующих ситуациях:
- Улучшение читаемости и понятности кода.
- Оптимизация производительности.
- Устранение дублирования кода.
Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
Что такое рефакторинг?
Рефакторинг кода может применяться в следующих ситуациях:
- Улучшение читаемости и понятности кода.
- Оптимизация производительности.
- Устранение дублирования кода.
Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
Ключевое слово const
Ключевое слово const используется для создания констант и неизменяемых объектов.
- Const для объявления переменных: запрещает изменение объекта после инициализации.
- Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.
- Функции, возвращающие const значения: гарантируют, что функция не изменит объект.
- Const члены класса: нельзя изменить через объект класса.
- Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#это_база
Ключевое слово const используется для создания констант и неизменяемых объектов.
- Const для объявления переменных: запрещает изменение объекта после инициализации.
- Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.
- Функции, возвращающие const значения: гарантируют, что функция не изменит объект.
- Const члены класса: нельзя изменить через объект класса.
- Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#это_база
Ключевое слово auto
Он был введен в C++11 для упрощения объявления переменных, избавляя от необходимости указывать длинные и сложные типы.
При использовании
Работает для любых типов данных — встроенных, пользовательских, шаблонов.
Переменная, объявленная с
#это_база
auto
— это тип вывода, который позволяет компилятору автоматически определять тип переменной на основе выражения инициализации. Он был введен в C++11 для упрощения объявления переменных, избавляя от необходимости указывать длинные и сложные типы.
При использовании
auto
тип переменной выводится компилятором во время компиляции и не может меняться во время выполнения.Работает для любых типов данных — встроенных, пользовательских, шаблонов.
Переменная, объявленная с
auto
, всегда инициализируется при объявлении.auto
полезен при работе с итераторами, с функциями возврата сложных типов, для упрощения кода.#это_база
#вопросы_с_собеседований
Как работают константные методы?
Константные методы — это методы, которые помечены модификатором final. Это означает, что тело метода не может быть переопределено в подклассах.
Константные методы часто используются, когда нужно предоставить клиентам неизменяемую реализацию некоторой функциональности. Например, утилитные классы часто содержат константные методы.
Основные характеристики константных методов:
— Могут вызываться на экземплярах класса, так как не являются статическими.
— Может обращаться к полям класса, даже нестатическим, т. к. вызывается на объекте класса.
— Может вызывать другие методы класса, в том числе не константные.
— Сигнатура константного метода в подклассе должна полностью совпадать с сигнатурой в суперклассе, иначе это будет перегрузка, а не переопределение.
Как работают константные методы?
Константные методы часто используются, когда нужно предоставить клиентам неизменяемую реализацию некоторой функциональности. Например, утилитные классы часто содержат константные методы.
Основные характеристики константных методов:
— Могут вызываться на экземплярах класса, так как не являются статическими.
— Может обращаться к полям класса, даже нестатическим, т. к. вызывается на объекте класса.
— Может вызывать другие методы класса, в том числе не константные.
— Сигнатура константного метода в подклассе должна полностью совпадать с сигнатурой в суперклассе, иначе это будет перегрузка, а не переопределение.
rvalue
Константные ссылки или ссылки на
Неконстантные ссылки (
*
#это_база
Rvalue
— это временный объект, который может быть перемещен или скопирован. Например, результат выражения или возвращаемое значение функции — это rvalue
. Rvalues
являются временными объектами, которые разрушаются после использования. Перемещение ресурсов из rvalue
более эффективно, чем копирование.Константные ссылки или ссылки на
const
(const T&
) могут связываться только с lvalues
.Неконстантные ссылки (
T&
) могут связываться как с lvalues
, так и с rvalues
.*
Lvalue
— объект с именем, например переменная.#это_база
Токенизация строки
Токенизация строки — это процесс разбиения строки на токены (лексемы) — отдельные элементы, например слова, числа, операторы.
Для токенизации нужно:
— Разбить строку на токены при помощи разделителей, например пробелов.
— Классифицировать каждый токен — определить его тип (число, строка, оператор и т. д.)
— Преобразовать токены к нужному типу, например из строки в число.
— Сохранить результаты в подходящей структуре данных.
— Обрабатывать ошибки, например неверный формат числа.
Для разбиения строки на токены в С++ удобно использовать
Для хранения результатов часто используют структуры или классы, хранящие тип и значение токена.
Токенизация нужна для разбора входных данных, конфигурационных файлов, математических выражений и т. д.
#это_база
Токенизация строки — это процесс разбиения строки на токены (лексемы) — отдельные элементы, например слова, числа, операторы.
Для токенизации нужно:
— Разбить строку на токены при помощи разделителей, например пробелов.
— Классифицировать каждый токен — определить его тип (число, строка, оператор и т. д.)
— Преобразовать токены к нужному типу, например из строки в число.
— Сохранить результаты в подходящей структуре данных.
— Обрабатывать ошибки, например неверный формат числа.
Для разбиения строки на токены в С++ удобно использовать
stringstream
.Для хранения результатов часто используют структуры или классы, хранящие тип и значение токена.
Токенизация нужна для разбора входных данных, конфигурационных файлов, математических выражений и т. д.
#это_база
buf указатель
buf — это указатель на буфер (массив байтов), часто использующийся для работы с бинарными данными.
Объявляется как
В основном используется совместно с функциями
Часто применяется в сетевом программировании, криптографии.
buf — это указатель на буфер (массив байтов), часто использующийся для работы с бинарными данными.
Объявляется как
u_char *buf
или unsigned char *buf
. Хранит данные типа unsigned char
. Используется для указания на выделенный буфер памяти, куда будут помещаться данные.В основном используется совместно с функциями
memcpy
, memset
и др. для копирования данных.Часто применяется в сетевом программировании, криптографии.
std::array
В отличие от обычных C-style массивов,
Основные характеристики:
— Размер массива задается шаблонным параметром и не может изменяться во время выполнения.
— Элементы хранятся в последовательной памяти, что дает хорошую локальность и производительность.
— Поддерживает итераторы, можно использовать в циклах range-for.
— Имеет полезные методы —
— Автоматически инициализирует элементы по умолчанию.
— Передается по значению, в отличие от сырых указателей.
std::array
— это шаблонный контейнерный тип данных, представляющий собой статический массив с фиксированным размером. В отличие от обычных C-style массивов,
std::array
является полноценным объектом со всеми преимуществами ООП.Основные характеристики:
— Размер массива задается шаблонным параметром и не может изменяться во время выполнения.
— Элементы хранятся в последовательной памяти, что дает хорошую локальность и производительность.
— Поддерживает итераторы, можно использовать в циклах range-for.
— Имеет полезные методы —
size()
, front()
, back()
, data()
и др.— Автоматически инициализирует элементы по умолчанию.
— Передается по значению, в отличие от сырых указателей.
Декомпозиция при объявлении (structural bindings)
Structural bindings — это возможность С++17 разложить объект на отдельные переменные прямо в месте объявления.
Позволяет избежать временных объектов при разборе структур, сокращает и упрощает код при работе со структурами.
Structural bindings активно используется в модульном тестировании для проверки структур и классов.
Также применяется для деструктуризации данных в функциональном программировании.
Structural bindings — это возможность С++17 разложить объект на отдельные переменные прямо в месте объявления.
Позволяет избежать временных объектов при разборе структур, сокращает и упрощает код при работе со структурами.
Structural bindings активно используется в модульном тестировании для проверки структур и классов.
Также применяется для деструктуризации данных в функциональном программировании.