Memento
Memento — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать внутреннее состояние объекта без нарушения инкапсуляции. Он полезен, например, когда вам нужно реализовать функциональность отмены/возврата действий или сохранения состояния объекта для последующего восстановления.
#для_продвинутых
Memento — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать внутреннее состояние объекта без нарушения инкапсуляции. Он полезен, например, когда вам нужно реализовать функциональность отмены/возврата действий или сохранения состояния объекта для последующего восстановления.
#для_продвинутых
Лямбда-функция
Лямбда-функция (или просто лямбда) — это анонимная функция в C++, которая может быть определена непосредственно внутри кода. Лямбда-функции предоставляют более компактный и удобный способ создания небольших функций на лету, без необходимости объявления их отдельно.
Лямбда-функции также часто используются вместе с алгоритмами стандартной библиотеки C++, такими как
#для_начинающих
Лямбда-функция (или просто лямбда) — это анонимная функция в C++, которая может быть определена непосредственно внутри кода. Лямбда-функции предоставляют более компактный и удобный способ создания небольших функций на лету, без необходимости объявления их отдельно.
Лямбда-функции также часто используются вместе с алгоритмами стандартной библиотеки C++, такими как
std::for_each
, std::transform
, std::sort
(как на примере выше), и другими, чтобы создавать более компактный и выразительный код.#для_начинающих
std::atomic_flag
Метод
Метод
В этом примере создаются два потока
std::atomic_flag
является классом для реализации простой атомарной флаговой переменной. Он предоставляет механизм безопасной работы с флагом в многопоточной среде без необходимости использования блокировок.std::atomic_flag
имеет два основных метода: test_and_set()
и clear()
:Метод
test_and_set()
устанавливает флаг в "истину" и возвращает предыдущее значение флага. Если флаг уже был установлен, вызов test_and_set()
вернет true
, в противном случае он вернет false
.Метод
clear()
сбрасывает флаг в "ложь".В этом примере создаются два потока
workerThread1
и workerThread2
, которые пытаются получить доступ к защищенному блоку кода. Флаг flag
инициализируется значением true
с помощью ATOMIC_FLAG_INIT
. В цикле worker()
каждый поток пытается вызвать test_and_set()
для захвата флага. Если флаг уже установлен, поток ждет и повторно пытается его захватить. Когда флаг наконец захватывается, поток выполняет некоторую работу и вызывает clear()
для освобождения флага.std::async
В C++
Функция
В этом примере функция
Функция
В C++
std::async
- это шаблон функции, предоставляемый стандартной библиотекой <future>
. Он используется для асинхронного выполнения функции или вызываемого объекта и получения объекта future, представляющего результат вычислений.Функция
std::async
создает новый поток или использует существующий поток из пула потоков реализации для выполнения поставленной задачи. Она возвращает объект std::future
, который можно использовать для получения результата или статуса вычисления.В этом примере функция
AddNumbers
выполняется асинхронно с использованием std::async
. Она принимает два целых числа в качестве аргументов и возвращает их сумму. Функция std::async
вызывается с помощью AddNumbers
и аргументов 5 и 10.Функция
std::async
возвращает объект std::future<int>
, который представляет собой результат вычисления. Вызывая функцию get()
на объекте future
, мы блокируем выполнение до завершения вычислений и получаем результат.#вопросы_с_собеседований
Какой код выполняется до функции main?
Ответ:
Конструкторы глобальных объектов.
Какой код выполняется до функции main?
Ответ:
с новым годом, любители С++ 😘
Please open Telegram to view this post
VIEW IN TELEGRAM
#вопросы_с_собеседований
Что выведет код сверху?
Ответ: “Constructor called” 5 раз и затем “Destructor called” 5 раз.
В приведенной выше программе мы сначала инициировали переменные с пятью указателями, используя ключевое слово new, следовательно, после этого будет вызван конструктор fives time, поскольку мы используем delete[] (используется для удаления нескольких объектов) для удаления переменных, следовательно, все созданные пять объектов будут уничтожены и, следовательно, будет вызван деструктор five times.
Что выведет код сверху?
В приведенной выше программе мы сначала инициировали переменные с пятью указателями, используя ключевое слово new, следовательно, после этого будет вызван конструктор fives time, поскольку мы используем delete[] (используется для удаления нескольких объектов) для удаления переменных, следовательно, все созданные пять объектов будут уничтожены и, следовательно, будет вызван деструктор five times.
Введение в разработку C++ в UE4
Это руководство покажет вам как писать код на С++ в Unreal Engine.
Смотреть статью
Это руководство покажет вам как писать код на С++ в Unreal Engine.
Смотреть статью
std::unordered_map
std::unordered_map - это контейнерный класс, который предоставляет структуру данных, известную как хэш-карта или хэш-таблица. Он доступен начиная с C++11.
Контейнер std::unordered_map хранит элементы в виде пар ключ-значение, где каждый ключ уникален, а производительность зависит от качества хэш-функции, используемой для сопоставления ключей с базовыми корзинами.
std::unordered_map в качестве ключей поддерживает встроенные типы, типы, определяемые пользователем, и даже структуры или классы.
std::unordered_map - это контейнерный класс, который предоставляет структуру данных, известную как хэш-карта или хэш-таблица. Он доступен начиная с C++11.
Контейнер std::unordered_map хранит элементы в виде пар ключ-значение, где каждый ключ уникален, а производительность зависит от качества хэш-функции, используемой для сопоставления ключей с базовыми корзинами.
std::unordered_map в качестве ключей поддерживает встроенные типы, типы, определяемые пользователем, и даже структуры или классы.
-
В этом примере мы создаем myMap
, которая сопоставляет целые числа со строками. -
С помощью функции insert()
вставляются 3 пары ключ-значение. -
Затем мы получаем доступ и печатаем значение, связанное с ключом 2, используя оператор []
. -
С помощью функции erase()
удаляем значение с ключом 3. -
Далее мы выполняем итерации по карте с помощью цикла for
, чтобы вывести все пары ключ-значение. -
Наконец, мы используем функцию find()
, чтобы проверить, существует ли ключ 2 в карте.Библиотечный метод
Продемонстрируйте работу метода сортировки вставками по возрастанию. Для этого выведите состояние данного массива после каждой вставки на отдельных строках. Если массив упорядочен изначально, не нужно ничего выводить.
Формат входных данных:
На первой строке дано целое число n (1 ≤ n ≤ 100) – количество элементов в массиве. На второй строке задан сам массив: последовательность натуральных чисел, не превышающих 10^9.
Формат выходных данных:
В выходной файл выведите строки (по количеству вставок) по n чисел каждая.
Продемонстрируйте работу метода сортировки вставками по возрастанию. Для этого выведите состояние данного массива после каждой вставки на отдельных строках. Если массив упорядочен изначально, не нужно ничего выводить.
Формат входных данных:
На первой строке дано целое число n (1 ≤ n ≤ 100) – количество элементов в массиве. На второй строке задан сам массив: последовательность натуральных чисел, не превышающих 10^9.
Формат выходных данных:
В выходной файл выведите строки (по количеству вставок) по n чисел каждая.
std::any
Это функция C++17, которая предоставляет безопасный с точки зрения типов контейнер для единичных значений любого типа. Она позволяет хранить и манипулировать значениями разных типов в одном объекте, подобно
Класс
В этом примере мы создаем объект
Однако при попытке извлечь значение, используя неправильный тип (в данном случае
Это функция C++17, которая предоставляет безопасный с точки зрения типов контейнер для единичных значений любого типа. Она позволяет хранить и манипулировать значениями разных типов в одном объекте, подобно
std::variant
. Однако, в отличие от std::variant
, который требует явного указания допустимых типов, std::any
может хранить значения любого типа.Класс
std::any
является частью стандартной библиотеки C++ и определяется в заголовке <any>
. std::any
предоставляет функции, такие как type()
, has_value()
, reset()
, emplace()
и другие, которые позволяют манипулировать и запрашивать хранимое значение.В этом примере мы создаем объект
val
, который может хранить значения любого типа. Мы присваиваем val
различные значения и извлекаем их с помощью std::any_cast
и проверки типа с помощью typeid
.Однако при попытке извлечь значение, используя неправильный тип (в данном случае
std::any_cast<int>
), возникает исключение std::bad_any_cast
, которое можно обработать с помощью try-catch.Curiously Recurring Template Pattern (CRTP)
CRTP предполагает использование шаблонов и наследования для достижения формы статического полиморфизма. Он позволяет производному классу наследоваться от базового, который параметризуется самим производным классом в качестве аргумента шаблона.
В данном примере класс
Функция
Когда функция
CRTP предполагает использование шаблонов и наследования для достижения формы статического полиморфизма. Он позволяет производному классу наследоваться от базового, который параметризуется самим производным классом в качестве аргумента шаблона.
В данном примере класс
Base
является шаблонным классом, который принимает производный класс (Derived1
или Derived2
) в качестве аргумента шаблона. Класс Base
предоставляет общую функциональность или интерфейс, который может быть настроен каждым производным классом.Функция
implementation()
в базовом классе определяется как невиртуальная. Внутри функции implementation()
используется static_cast<Derived*>(this)
для приведения указателя к типу производного класса. Это позволяет каждому производному классу предоставлять свою собственную реализацию функции implementation()
.Когда функция
implementation()
вызывается на экземпляре производного класса, она вызывает соответствующую реализацию в этом производном классе.You Ain't Gonna Need It (YAGNI)
You Ain't Gonna Need It (Вам это не понадобится) - это принцип разработки программного обеспечения, который поощряет простоту и избегает чрезмерной инженерии. принцип YAGNI побуждает разработчиков реализовывать только те функции, которые необходимы в данный момент, а не добавлять функциональность, которая может потребоваться в будущем, но в данный момент не нужна.
Вот ключевые аспекты применения принципа YAGNI:
- Минимализм: Пишите минимальный объем кода, необходимый для выполнения непосредственных требований.
- Избегайте спекулятивной разработки: Не реализуйте функции на основе спекулятивных будущих требований.
- Рефакторинг: Перерабатывайте код, чтобы удалить все ненужные или неиспользуемые функции. Это помогает сохранить код компактным и удобным для обслуживания.
- Разработка, управляемая тестами: Пишите тесты для проверки необходимых функций, а не обширного тестирования гипотетических функциональных возможностей.
Помните, что принцип заключается не в ограничении гибкости, а в принятии обоснованных решений, основанных на реальных требованиях.
You Ain't Gonna Need It (Вам это не понадобится) - это принцип разработки программного обеспечения, который поощряет простоту и избегает чрезмерной инженерии. принцип YAGNI побуждает разработчиков реализовывать только те функции, которые необходимы в данный момент, а не добавлять функциональность, которая может потребоваться в будущем, но в данный момент не нужна.
Вот ключевые аспекты применения принципа YAGNI:
- Минимализм: Пишите минимальный объем кода, необходимый для выполнения непосредственных требований.
- Избегайте спекулятивной разработки: Не реализуйте функции на основе спекулятивных будущих требований.
- Рефакторинг: Перерабатывайте код, чтобы удалить все ненужные или неиспользуемые функции. Это помогает сохранить код компактным и удобным для обслуживания.
- Разработка, управляемая тестами: Пишите тесты для проверки необходимых функций, а не обширного тестирования гипотетических функциональных возможностей.
Помните, что принцип заключается не в ограничении гибкости, а в принятии обоснованных решений, основанных на реальных требованиях.
#вопросы_с_собеседований
Почему рекомендуется не использовать паттерн Singleton?
Singleton гарантирует, что класс имеет только один экземпляр и обеспечивает глобальную точку доступа к нему. Однако паттерн Singleton часто критикуют и не рекомендуют использовать по нескольким причинам:
1. Глобальное состояние: Singleton вносит глобальное состояние в приложение, что может привести к тесной связи между классами и затруднить рассуждения о поведении системы.
2. Скрытие зависимостей: Singleton скрывает зависимости, затрудняя понимание и рассуждения о взаимодействии между различными компонентами системы.
3. Сложности тестирования: Singleton может усложнить модульное тестирование. Поскольку он полагается на глобальное состояние, становится трудно изолировать и тестировать отдельные компоненты по отдельности. Это может привести к зависимостям и сделать тесты более хрупкими.
4. Безопасность потоков: Экземпляры Singleton могут создавать проблемы с безопасностью потоков. Если несколько потоков пытаются одновременно получить доступ или изменить Singleton, это может привести к неопределенному поведению. А дополнительное обеспечение безопасности потоков добавляет сложности и может повлиять на производительность.
Почему рекомендуется не использовать паттерн Singleton?
1. Глобальное состояние: Singleton вносит глобальное состояние в приложение, что может привести к тесной связи между классами и затруднить рассуждения о поведении системы.
2. Скрытие зависимостей: Singleton скрывает зависимости, затрудняя понимание и рассуждения о взаимодействии между различными компонентами системы.
3. Сложности тестирования: Singleton может усложнить модульное тестирование. Поскольку он полагается на глобальное состояние, становится трудно изолировать и тестировать отдельные компоненты по отдельности. Это может привести к зависимостям и сделать тесты более хрупкими.
4. Безопасность потоков: Экземпляры Singleton могут создавать проблемы с безопасностью потоков. Если несколько потоков пытаются одновременно получить доступ или изменить Singleton, это может привести к неопределенному поведению. А дополнительное обеспечение безопасности потоков добавляет сложности и может повлиять на производительность.
Поиск максимальной прибыли
Дан целочисленный массив prices, где prices[i] - это цена данной акции на i-й день. В каждый день вы можете принять решение о покупке и/или продаже акции. В любой момент времени вы можете держать не более одной акции. Однако вы можете купить ее и тут же продать в тот же день. Найдите и верните максимальную прибыль, которую вы можете получить.
Рассмотрим принцип работы maxProfit:
curHold хранит максимальную потенциальную прибыль, если у нас есть акции, а curNotHold - если у нас нет акций.
Для каждой цены алгоритм обновляет значения переменных.
- curHold считается как максимум из двух значений: предыдущего curHold (если мы продолжаем держать акции) и разности между предыдущим curNotHold и текущей ценой на акции (если мы покупаем акции сегодня).
- curNotHold считается как максимум из двух значений: предыдущего curNotHold (если мы продолжаем не покупать акции) и суммы предыдущего curHold и текущей цены на акции (если мы продаем акции сегодня).
#разбор_кода
Дан целочисленный массив prices, где prices[i] - это цена данной акции на i-й день. В каждый день вы можете принять решение о покупке и/или продаже акции. В любой момент времени вы можете держать не более одной акции. Однако вы можете купить ее и тут же продать в тот же день. Найдите и верните максимальную прибыль, которую вы можете получить.
Рассмотрим принцип работы maxProfit:
curHold хранит максимальную потенциальную прибыль, если у нас есть акции, а curNotHold - если у нас нет акций.
Для каждой цены алгоритм обновляет значения переменных.
- curHold считается как максимум из двух значений: предыдущего curHold (если мы продолжаем держать акции) и разности между предыдущим curNotHold и текущей ценой на акции (если мы покупаем акции сегодня).
- curNotHold считается как максимум из двух значений: предыдущего curNotHold (если мы продолжаем не покупать акции) и суммы предыдущего curHold и текущей цены на акции (если мы продаем акции сегодня).
#разбор_кода