В репозитории представлены решения трех задач: генератор псевдослучайных чисел, работа с маской и менеджер статической памяти. Код написан на стандарте C++17.
Реализован класс генератора на основе линейного конгруэнтного метода: X[N+1] = (a * X[N] + c) % m.
- Поскольку коэффициенты вещественные, для вычисления остатка от деления используется функция
std::fmod. - Реализован
InputIterator, что позволяет использовать генератор в циклах range-based и алгоритмах STL. - Метод
end(eps)возвращает итератор, который останавливает перебор, когда текущее значение генератора совпадает с начальным (с заданной точностьюeps). Это предотвращает бесконечные циклы.
Шаблонный класс Mask<N>, где N — размер маски.
- Конструктор принимает переменное количество аргументов, проверяя их количество (
static_assert) и значения (0 или 1). - Метод
slice: модифицирует переданный контейнер "на месте". Использует два итератора (чтение/запись) для сдвига элементов, соответствующих единице в маске, в начало контейнера. Лишние элементы удаляются черезresize. - Методы
transformиslice_and_transformсоздают новые контейнеры, применяя функцию-преобразователь к выбранным элементам.
Класс, реализующий выделение памяти под объекты без использования динамической кучи.
- Память выделяется статически в виде массива
std::byte. Используется спецификаторalignas(T)для корректного выравнивания. - Создание объектов (
create) происходит с помощьюplacement new. Аргументы конструктора передаются черезstd::forward. - Удаление (
delete_obj) реализовано через явный вызов деструктора. - Метод
positionопределяет индекс объекта путем вычисления смещения его адреса относительно начала буфера. Добавлены проверки на корректность указателя.
g++ main.cpp -std=c++17 -o solution
./solution