Концепт IterToComparable появился в стандарте C++20 и используется для проверки того, что итератор указывает на объекты, которые можно сравнивать.
Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как <, <=, >, >=.
В примере используется концепт iter_to_comparable для проверки, что итератор по std::vector указывает на сравнимые объекты int. Это позволяет корректно найти минимальный элемент с помощью std::min_element.
Концепт is_floating_point_v используется для проверки, является ли тип данных числом с плавающей точкой. Концепт std::is_floating_point_v был введён в C++20.
Он позволяет выполнять различную обработку в зависимости от того, является ли тип числом с плавающей точкой или нет.
В примере мы используем концепт is_floating_point_v для проверки типа параметра value и выполнения разной обработки в зависимости от результата. Это позволяет гибко работать с разными типами данных в одной функции.
Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле <algorithm>.
Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.
Работает для любых типов данных, которые можно сравнивать с помощью <.
Метод wcscmp() используется для сравнения двух строк, представленных в виде указателей на символы типа wchar_t.
Метод принимает два указателя на нуль-терминированные строки типа wchar_t, сравнивает строки побайтово и возвращает 0, если строки идентичны, положительное число, если первая строка больше второй, или отрицательное число, если первая строка меньше второй.
Работает так же, как стандартная функция strcmp(), но для строк типа wchar_t.
#вопросы_с_собеседований Что такое специализация шаблона?
Специализация шаблона — это возможность создать отдельную реализацию шаблонной функции или класса для конкретных типов параметров. Это позволяет оптимизировать шаблонные решения для частных случаев.
Например, можно создать специализацию std::vector для bool, которая будет хранить данные в битовых полях, а не как отдельные элементы.
При вызове шаблона компилятор будет искать специализацию для конкретных типов и использовать ее, если она есть. В противном случае используется обобщенная реализация.
#вопросы_с_собеседований Что такое флажки компиляции?
Флажки компиляции — это специальные опции, которые можно указать при компиляции кода, чтобы включить или отключить определенные возможности языка или библиотек.
Используя разные комбинации флажков, можно тонко настроить процесс компиляции под нужды конкретного проекта.
Например: — std=c++11: включает поддержку стандарта C++11. — O2: включает оптимизацию кода на уровне O2. — g: добавляет отладочную информацию в скомпилированный файл. — Wall: включает предупреждения обо всех возможных ошибках. — DDEBUG: определяет макрос DEBUG, чтобы можно было использовать условную компиляцию. — I<path>: добавляет директорию по указанному пути в поиск заголовочных файлов.
Концепт std::derived_from используется для проверки того, является ли один тип производным от другого. Он был введен в C++20. Концепт позволяет проверить, является ли тип Т производным от базового типа. Может использоваться в качестве ограничения шаблона для разрешения использования только производных типов
Заменяет использование std::is_base_of в коде шаблонов и часто применяется для указания в шаблонах и концептах, что параметр T должен быть производным от некоторого базового типа.
std::ranges::input_range — это концепция в библиотеке std::ranges, которая представляет диапазон элементов, из которого можно последовательно считывать значения. Она позволяет итерироваться по диапазону при помощи range-based for loop или итераторов.
Имеет begin()/end() методы, возвращающие итераторы на начало и конец диапазона.
Input_range часто используется для представления последовательностей элементов, к которым нужен последовательный доступ для чтения.
Метод find_last_not_of ищет последнее вхождение символа в строке, которое не совпадает ни с одним символом из указанной маски поиска.
Этот метод часто используется для поиска последнего символа в строке, отличного от заданного. Он принимает в качестве аргументов строку для поиска, маску поиска и опционально позицию, с которой начинать поиск.
Метод возвращает позицию найденного символа или npos, если такого символа нет.
#вопросы_с_собеседований Какая разница между модульными и интеграционными тестами?
Модульные тесты проверяют отдельные модули или компоненты системы по отдельности. Они позволяют протестировать корректность работы каждой единицы кода, независимо от остальной системы.
Интеграционные тесты проверяют работу нескольких модулей совместно, их взаимодействие. Цель - убедиться в корректной интеграции разных компонентов между собой.
TDD (Test-Driven Development) — это подход к разработке программного обеспечения, при котором сначала пишутся автоматические тесты, определяющие желаемое поведение кода, а затем реализуется минимально необходимый код, чтобы пройти эти тесты.
Основные принципы TDD: — Написание теста перед кодом: сначала пишется тест, определяющий желаемую функциональность. Затем пишется минимальный код, чтобы пройти этот тест. — Рефакторинг: после прохождения теста код рефакторится для улучшения структуры и читаемости, при этом все тесты должны оставаться пройденными. — Повторение: цикл повторяется — новый тест, код, рефакторинг. — Тесты должны быть автоматизированными и запускаться очень часто.
Преимущества TDD: предотвращение дефектов, улучшение структуры кода, быстрая обратная связь. TDD позволяет создавать код, удовлетворяющий требованиям и хорошо тестируемый.
std::enable_if — это шаблон, который позволяет условно включать функциональность в зависимости от удовлетворения какого-либо условия. Шаблон определен в заголовочном файле <type_traits> и позволяет "включить" код, если некое условие истинно, и "выключить", если ложно.
Часто используется для метапрограммирования — принятия решений на этапе компиляции, а также для перегрузки шаблонных функций.
В примере enable_if включит реализацию is_even только для целочисленных T. Для не целых типов компиляция завершится с ошибкой. Таким образом, enable_if позволяет гибко управлять логикой и функциональностью на этапе компиляции.
Спецификатор доступа default определяет область видимости членов класса, когда явный спецификатор доступа не указан. Он применяется только внутри класса или структуры.
Если при объявлении члена класса не указан спецификатор (public, private, protected), по умолчанию считается default.
В примере x объявлен без спецификатора доступа, значит его видимость по умолчанию — private. А y явно помечен как public и доступен извне класса. Таким образом, default позволяет не писать лишний private при объявлении членов класса.
Функция isalpha() проверяет, является ли символ буквой. Она определена в заголовочном файле <ctype.h>.
Функция принимает символ как аргумент и возвращает логическое значение — true, если символ является буквой латинского алфавита и false — для небуквенных символов. Может распознавать как строчные, так и прописные буквы.
Метод map::emplace_hint — это оптимизированный способ вставки элемента в ассоциативный контейнер std::map. Он позволяет конструировать объект прямо в памяти контейнера, избегая лишних копирований.
Метод принимает хинт — итератор, указывающий приблизительное место вставки, использует его для оптимизации поиска нужного места вставки. Затем возвращает пару (итератор на вставленный элемент, флаг успешности вставки).
Ссылки - это альтернативные имена для существующих переменных. Переменная может быть объявлена как ссылка, используя символ &. Ссылка может быть определена как тип переменной, который может действовать как ссылка на другую переменную.
Символ & используется для обозначения адреса переменной или любой памяти. Переменные, связанные со ссылочными переменными, могут быть доступны как по имени, так и по ссылочной переменной, связанной с ними.
Using-декларации используются для импорта имен в текущую область видимости. Они позволяют избежать необходимости квалифицировать имена из других пространств имен при использовании.
Основные моменты о using-декларациях:
— Позволяют импортировать отдельные имена, например классы, функции или константы. — Могут применяться как внутри блоков кода, так и вне их. Вне блоков имена импортируются в глобальную область видимости. — Не импортируют всё пространство имен целиком, в отличие от директив using namespace. — Помогают избежать конфликтов имен из разных пространств.