Senior C++ Developer
12.5K subscribers
1.35K photos
3 videos
608 links
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
std::enable_if

std::enable_if — это шаблон, который позволяет условно включать функциональность в зависимости от удовлетворения какого-либо условия.
Шаблон определен в заголовочном файле <type_traits> и позволяет "включить" код, если некое условие истинно, и "выключить", если ложно.

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

В примере enable_if включит реализацию is_even только для целочисленных T. Для не целых типов компиляция завершится с ошибкой.
Таким образом, enable_if позволяет гибко управлять логикой и функциональностью на этапе компиляции.
#вопросы_с_собеседований
Что такое TDD?

TDD (Test-Driven Development) — это подход к разработке программного обеспечения, при котором сначала пишутся автоматические тесты, определяющие желаемое поведение кода, а затем реализуется минимально необходимый код, чтобы пройти эти тесты.

Основные принципы TDD:
— Написание теста перед кодом: сначала пишется тест, определяющий желаемую функциональность. Затем пишется минимальный код, чтобы пройти этот тест.
— Рефакторинг: после прохождения теста код рефакторится для улучшения структуры и читаемости, при этом все тесты должны оставаться пройденными.
— Повторение: цикл повторяется — новый тест, код, рефакторинг.
— Тесты должны быть автоматизированными и запускаться очень часто.

Преимущества TDD: предотвращение дефектов, улучшение структуры кода, быстрая обратная связь.
TDD позволяет создавать код, удовлетворяющий требованиям и хорошо тестируемый.
#вопросы_с_собеседований
Какая разница между модульными и интеграционными тестами?

Модульные тесты проверяют отдельные модули или компоненты системы по отдельности. Они позволяют протестировать корректность работы каждой единицы кода, независимо от остальной системы.

Интеграционные тесты проверяют работу нескольких модулей совместно, их взаимодействие. Цель - убедиться в корректной интеграции разных компонентов между собой.
Метод map::max_size()

Метод map::max_size() возвращает максимально возможное количество элементов, которое может содержать объект map.

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

В этом примере сначала получаем максимальный размер контейнера mymap с помощью max_size(). Затем добавляем 100 элементов и выводим текущий размер.

#это_база
Метод find_last_not_of

Метод find_last_not_of ищет последнее вхождение символа в строке, которое не совпадает ни с одним символом из указанной маски поиска.

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

Метод возвращает позицию найденного символа или npos, если такого символа нет.

#это_база
std::ranges::input_range

std::ranges::input_range — это концепция в библиотеке std::ranges, которая представляет диапазон элементов, из которого можно последовательно считывать значения.
Она позволяет итерироваться по диапазону при помощи range-based for loop или итераторов.

Имеет begin()/end() методы, возвращающие итераторы на начало и конец диапазона.

Input_range часто используется для представления последовательностей элементов, к которым нужен последовательный доступ для чтения.
Концепт Derived

Концепт std::derived_from используется для проверки того, является ли один тип производным от другого. Он был введен в C++20.
Концепт позволяет проверить, является ли тип Т производным от базового типа. Может использоваться в качестве ограничения шаблона для разрешения использования только производных типов

Заменяет использование std::is_base_of в коде шаблонов и часто применяется для указания в шаблонах и концептах, что параметр T должен быть производным от некоторого базового типа.
#вопросы_с_собеседований
Что такое флажки компиляции?

Флажки компиляции — это специальные опции, которые можно указать при компиляции кода, чтобы включить или отключить определенные возможности языка или библиотек.

Используя разные комбинации флажков, можно тонко настроить процесс компиляции под нужды конкретного проекта.

Например:
std=c++11: включает поддержку стандарта C++11.
O2: включает оптимизацию кода на уровне O2.
g: добавляет отладочную информацию в скомпилированный файл.
Wall: включает предупреждения обо всех возможных ошибках.
DDEBUG: определяет макрос DEBUG, чтобы можно было использовать условную компиляцию.
I<path>: добавляет директорию по указанному пути в поиск заголовочных файлов.
#вопросы_с_собеседований
Что такое специализация шаблона?

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

Например, можно создать специализацию std::vector для bool, которая будет хранить данные в битовых полях, а не как отдельные элементы.

При вызове шаблона компилятор будет искать специализацию для конкретных типов и использовать ее, если она есть. В противном случае используется обобщенная реализация.
Метод wcscmp()

Метод wcscmp() используется для сравнения двух строк, представленных в виде указателей на символы типа wchar_t.

Метод принимает два указателя на нуль-терминированные строки типа wchar_t, сравнивает строки побайтово и возвращает 0, если строки идентичны, положительное число, если первая строка больше второй, или отрицательное число, если первая строка меньше второй.

Работает так же, как стандартная функция strcmp(), но для строк типа wchar_t.

#это_база
Алгоритм lexicographic_compare

Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле <algorithm>.

Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.

Работает для любых типов данных, которые можно сравнивать с помощью <.

#это_база
Концепт is_floating_point_v

Концепт is_floating_point_v используется для проверки, является ли тип данных числом с плавающей точкой. Концепт std::is_floating_point_v был введён в C++20.

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

В примере мы используем концепт is_floating_point_v для проверки типа параметра value и выполнения разной обработки в зависимости от результата.
Это позволяет гибко работать с разными типами данных в одной функции.
Концепт IterToComparable

Концепт IterToComparable появился в стандарте C++20 и используется для проверки того, что итератор указывает на объекты, которые можно сравнивать.

Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как <, <=, >, >=.

В примере используется концепт iter_to_comparable для проверки, что итератор по std::vector указывает на сравнимые объекты int. Это позволяет корректно найти минимальный элемент с помощью std::min_element.
#вопросы_с_собеседований
Какими особенностями должен обладать класс, чтобы он был итератором?

Чтобы класс был итератором в С++, он должен реализовывать несколько важных методов:

operator++ — для перехода к следующему элементу итерируемой последовательности.
operator* — для получения текущего элемента.
operator!= и operator== — для сравнения итераторов.

Кроме того, итераторы обычно реализуют концепцию инвалидации — то есть итератор становится невалидным после изменений в итерируемой последовательности.
#вопросы_с_собеседований
Что такое атомарная операция?

Атомарная операция — это операция, которая выполняется как одна неделимая инструкция.

Атомарность гарантирует, что при выполнении такой операции никакая другая нить или процесс не сможет получить доступ к изменяемым данным.
Например, инкремент или декремент числовой переменной является атомарной операцией. Чтение и запись указателя также происходит атомарно.

Атомарность важна в многопоточном программировании — она позволяет избежать гонок данных при обращении разных потоков к общим данным.
Метод floor

Метод floor() используется для округления числа с плавающей точкой в меньшую сторону до ближайшего целого числа.

Он объявлен в заголовочном файле <cmath>, принимает в качестве аргумента число с плавающей точкой типа float или double и возвращает целочисленное значение типа int или long.

Если аргумент уже является целым числом, то вернется то же самое число.

#это_база
⚙️ Курс «Введение в реверс-инжиниринг»

Изучите тайны программного обеспечения и познакомьтесь с обратной разработкой на курсе от Академии Кодебай.

Всего за 6 месяцев вы научитесь анализировать исполняемые файлы, понимать их структуру и исследовать вредоносное ПО. Главной темой курса является реверс-инжиниринг программ, написанных на языке ассемблера и Си. 

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

📆 Старт курса - 6 ноября 

🔝 Преимущества: личная поддержка от куратора, более 120 заданий в практической лаборатории, закрытый чат единомышленников и сертификат при успешной сдаче экзамена.

ℹ️ Узнать подробнее о курсе

Реклама. ООО "АКАДЕМИЯ КОДЕБАЙ". ИНН 9706020333. erid: LjN8JxcgP
Бинарный поиск

Бинарный поиск — это алгоритм поиска элемента в отсортированном массиве, который работает значительно быстрее, чем линейный поиск.

Бинарный поиск работает только на отсортированных массивах.

На каждой итерации он делит массив пополам и сравнивает элемент в середине с искомым. За счет этого быстро сужается область поиска.

#это_база
Функция std::midpoint

Функция std::midpoint была добавлена в стандарт C++ в C++20. Она предназначена для вычисления средней точки между двумя значениями с учетом их типов. Это может быть полезно, например, при работе с числами разных типов, когда необходимо найти точку, находящуюся ровно посередине между двумя значениями.

Обратите внимание, что std::midpoint также поддерживает различные типы, такие как целые числа, числа с плавающей запятой и пользовательские типы, для которых определены операторы сложения и деления.

#для_начинающих
DynaPDF

DynaPDF — это библиотека для работы с PDF-файлами, доступная на различных языках программирования, включая C++. Для использования DynaPDF в C++ вам нужно выполнить следующие шаги:

1. Получите библиотеку DynaPDF: Вы должны сначала получить доступ к библиотеке DynaPDF. Вы можете загрузить ее с официального веб-сайта DynaForms.
2. Включите библиотеку в свой проект: После загрузки библиотеки DynaPDF, вы должны включить ее в ваш проект C++. Это может потребовать добавления соответствующего пути к заголовочным файлам и библиотекам в настройках вашей среды разработки.
3. Создайте код для работы с DynaPDF: Теперь вы можете начать писать код на C++, который использует функции и классы, предоставляемые DynaPDF, для создания, редактирования и обработки PDF-файлов. Для этого вы можете использовать функции и классы, предоставленные библиотекой DynaPDF.

#для_продвинутых