Curiously recurring template pattern (CRTP)
Curiously Recurring Template Pattern (CRTP) - это техника, используемая в C++, при которой класс наследуется от самого себя в качестве параметра шаблона. Эта техника позволяет создавать классы с доступом к своим собственным членам через наследование, что может быть полезно для реализации различных шаблонов проектирования и оптимизации кода.
#для_начинающих
Curiously Recurring Template Pattern (CRTP) - это техника, используемая в C++, при которой класс наследуется от самого себя в качестве параметра шаблона. Эта техника позволяет создавать классы с доступом к своим собственным членам через наследование, что может быть полезно для реализации различных шаблонов проектирования и оптимизации кода.
#для_начинающих
Алгоритм forward_list::before_begin()
Алгоритм возвращает итератор, указывающий на позицию перед первым элементом forward_list.
Временная сложность:
Подробнее можно почитать здесь.
Алгоритм возвращает итератор, указывающий на позицию перед первым элементом forward_list.
Временная сложность:
O(1)
Вспомогательное пространство: O(1)
.Подробнее можно почитать здесь.
Метод crbegin
Возвращает постоянный обратный итератор, указывающий на последний элемент вектора (обратное начало). Он перемещается от последнего к первому элементу.
Подробнее можно почитать здесь.
Возвращает постоянный обратный итератор, указывающий на последний элемент вектора (обратное начало). Он перемещается от последнего к первому элементу.
Подробнее можно почитать здесь.
Декларатор ссылки lvalue: &
Содержит адрес объекта, но синтаксически ведет себя подобно объекту.
Ссылку lvalue можно считать другим именем для объекта. Объявление ссылки lvalue состоит из необязательного списка спецификаторов, за которым следует декларатор ссылки. Ссылка должна быть инициализирована и не может быть изменена.
Любой объект, адрес которого можно преобразовать в некоторый тип указателя, можно также преобразовать в аналогичный ссылочный тип. Например, любой объект, адрес которого можно преобразовать в тип char *, можно также преобразовать в тип char &.
В примере демонстрируется декларатор ссылки путем объявления объекта Person и ссылки на этот объект. Поскольку rFriend является ссылкой на myFriend, при обновлении любой из этих переменных изменяется один и тот же объект.
Содержит адрес объекта, но синтаксически ведет себя подобно объекту.
Ссылку lvalue можно считать другим именем для объекта. Объявление ссылки lvalue состоит из необязательного списка спецификаторов, за которым следует декларатор ссылки. Ссылка должна быть инициализирована и не может быть изменена.
Любой объект, адрес которого можно преобразовать в некоторый тип указателя, можно также преобразовать в аналогичный ссылочный тип. Например, любой объект, адрес которого можно преобразовать в тип char *, можно также преобразовать в тип char &.
В примере демонстрируется декларатор ссылки путем объявления объекта Person и ссылки на этот объект. Поскольку rFriend является ссылкой на myFriend, при обновлении любой из этих переменных изменяется один и тот же объект.
CRYENGINE — мощная платформа для разработки игр в реальном времени на С++, созданная Crytek.
https://www.cryengine.com/
https://www.cryengine.com/
CRYENGINE
CRYENGINE | The complete solution for next generation game development by Crytek
The complete solution for next generation game development by Crytek
C++, ping и traceroute
Ping — утилита для проверки целостности и качества соединений в сетях на основе TCP/IP, а также обиходное наименование самого запроса
Смотреть статью
Ping — утилита для проверки целостности и качества соединений в сетях на основе TCP/IP, а также обиходное наименование самого запроса
Смотреть статью
#вопросы_с_собеседований
Что дают разные модификаторы при наследовании?
Ответ:
Изменяют зону видимости членов базового класса.
При private наследовании protected и public члены становятся private. При protected наследовании public становится protected. А при public ничего не изменяется.
Что дают разные модификаторы при наследовании?
Ответ:
При private наследовании protected и public члены становятся private. При protected наследовании public становится protected. А при public ничего не изменяется.
Алгоритм find_if и find_if_not
Алгоритм find_if возвращает итератор к первому элементу в диапазоне [first, last), для которого pred(Uniary Function) возвращает true. Если такой элемент не найден, функция возвращает последний элемент.
Алгоритм find_if_not возвращает итератор к первому элементу в диапазоне [first, last), для которого pred(Uniary Function) возвращает false. Если такой элемент не найден, функция возвращает последний элемент.
Алгоритм find_if возвращает итератор к первому элементу в диапазоне [first, last), для которого pred(Uniary Function) возвращает true. Если такой элемент не найден, функция возвращает последний элемент.
Алгоритм find_if_not возвращает итератор к первому элементу в диапазоне [first, last), для которого pred(Uniary Function) возвращает false. Если такой элемент не найден, функция возвращает последний элемент.
Указатели с ключевыми словами const и volatile
Ключевые слова const и volatile изменяют то, как обрабатываются указатели. const указывает, что данные по указателю не могут быть изменены после инициализации; volatile указывает, что значение может быть изменено действиями, отличными от тех, которые указаны в пользовательском приложении.
volatile полезно для объявления объектов в общей памяти, к которым могут обращаться несколько процессов или для глобальных областей данных.
Ключевые слова const и volatile изменяют то, как обрабатываются указатели. const указывает, что данные по указателю не могут быть изменены после инициализации; volatile указывает, что значение может быть изменено действиями, отличными от тех, которые указаны в пользовательском приложении.
volatile полезно для объявления объектов в общей памяти, к которым могут обращаться несколько процессов или для глобальных областей данных.
•
A[8] - это то же самое, что и *(A + 8). Так как операция сложения ассоциативна, она может быть переписана как *(8 + A), что синонимично ..... 8[A]Please open Telegram to view this post
VIEW IN TELEGRAM
Использование
std::shared_mutex
и std::shared_lock
позволяет эффективно управлять многопоточным доступом к ресурсам, повышая производительность за счет одновременного чтения и блокирования только при записи.Это особенно полезно для сценариев, где чтение данных происходит чаще, чем запись.
Please open Telegram to view this post
VIEW IN TELEGRAM
std::shared_ptr
— это умный указатель, который позволяет нескольким указателям совместно владеть одним объектом.•
Когда последний std::shared_ptr
, указывающий на объект, удаляется, объект также уничтожается.Please open Telegram to view this post
VIEW IN TELEGRAM
Функция std::atomic_load
Функция
Синтаксис:
#для_продвинутых
Функция
std::atomic_load
используется для атомарного чтения значения из атомарной переменной. Это означает, что чтение значения происходит без риска, что оно будет изменено другим потоком во время чтения.Синтаксис:
template <class T>
T atomic_load(const volatile atomic<T>* obj) noexcept;
template <class T>
T atomic_load(const atomic<T>* obj) noexcept;
#для_продвинутых
std::scoped_lock
#для_продвинутых
std::scoped_lock
— это класс-обертка над одним или несколькими мьютексами, который обеспечивает удобный механизм владения мьютексами в стиле RAII. При создании объекта std::scoped_lock
он пытается захватить владение мьютексами, которые ему передаются.std::scoped_lock
был добавлен в стандарт C++ в версии 17. Он является заменой устаревшего класса std::lock_guard
.#для_продвинутых
std::fstream
Для использования класса
Объект класса
#для_продвинутых
std::fstream
— это класс из стандартной библиотеки С++, который представляет собой поток данных, связанный с файлом. Он может использоваться для чтения, записи или одновременного чтения и записи из файла.Для использования класса
std::fstream
необходимо подключить заголовочный файл fstream
.Объект класса
std::fstream
создается с помощью конструктора, которому передается имя файла и режим открытия. Режим открытия определяет, как будет использоваться поток.#для_продвинутых
std::future::get()
Метод
Метод
Если асинхронное вычисление было прервано или завершилось с ошибкой, метод
#для_продвинутых
Метод
std::future::get()
в C++ используется для получения результата асинхронного вычисления, связанного с объектом std::future
.Метод
std::future::get()
блокирует текущий поток до тех пор, пока асинхронное вычисление не будет завершено. После завершения вычисления метод std::future::get()
возвращает результат вычисления.Если асинхронное вычисление было прервано или завершилось с ошибкой, метод
std::future::get()
бросает исключение std::future_error
.#для_продвинутых
std::logic_error
Класс
#для_продвинутых
std::logic_error
— это класс исключений в языке программирования C++, который используется для представления логических ошибок в программе. Логические ошибки — это ошибки, которые могут быть обнаружены до выполнения программы, например, нарушение логических предусловий или классовых инвариантов.Класс
std::logic_error
является производным от класса std::exception
, который является базовым классом для всех исключений в C++. Класс std::logic_error
имеет конструктор, который принимает строку в качестве аргумента. Эта строка используется для описания ошибки.#для_продвинутых
std::error_code
Код ошибки представляет собой платформо-зависимый код, который возвращается операционной системой при возникновении ошибки. Категория ошибки представляет собой более общий код, который может быть использован для классификации ошибок.
#для_продвинутых
std::error_code
— это класс в стандартном C++, который используется для представления ошибок. Он содержит два компонента: код ошибки, представляющий собой целое число, и категорию ошибки, представляющую собой строку.Код ошибки представляет собой платформо-зависимый код, который возвращается операционной системой при возникновении ошибки. Категория ошибки представляет собой более общий код, который может быть использован для классификации ошибок.
#для_продвинутых