std::duration
Шаблонный класс
— Количество периодов (tick count) типа Rep.
— Период тика (tick period), который представляет собой дробное число секунд, приходящееся на один тик.
Стандартная библиотека C++ предоставляет ряд предопределенных типов интервалов времени, таких как seconds, minutes, hours, days, weeks, months и years. Эти типы имеют следующие значения периода тика (2 картинка).
#для_начинающих
Шаблонный класс
std::duration
в С++ представляет собой интервал времени. Он состоит из двух частей:— Количество периодов (tick count) типа Rep.
— Период тика (tick period), который представляет собой дробное число секунд, приходящееся на один тик.
Стандартная библиотека C++ предоставляет ряд предопределенных типов интервалов времени, таких как seconds, minutes, hours, days, weeks, months и years. Эти типы имеют следующие значения периода тика (2 картинка).
#для_начинающих
std::nexttoward()
Функция
Функция принимает два аргумента:
Если оба аргумента равны, функция возвращает y, преобразованное к типу возвращаемого значения.
Возвращаемое значение:
Следующее представимое значение после
Если
#для_продвинутых
Функция
std::nexttoward()
возвращает следующее представимое значение после x
в направлении y
. Эта функция ведет себя аналогично функции std::nextafter()
, но с потенциально более точным y
.Функция принимает два аргумента:
x
— базовое значениеy
— значение, к которому приближается возвращаемое значениеЕсли оба аргумента равны, функция возвращает y, преобразованное к типу возвращаемого значения.
Возвращаемое значение:
Следующее представимое значение после
x
в направлении y
.Если
x
— это наибольшее конечное значение, представимое в типе, и результат бесконечен или не представим, возникает ошибка переполнения диапазона.#для_продвинутых
Функция std::adjacent_difference()
Функция
Сигнатура функции:
#для_продвинутых
Функция
std::adjacent_difference()
из библиотеки стандартных алгоритмов C++ вычисляет последовательные различия между каждым элементом и его предшественником в входном диапазоне. Результаты выводятся в диапазон назначения.Сигнатура функции:
template <class InputIt, class OutputIt>
OutputIt adjacent_difference(InputIt first, InputIt last, OutputIt d_first);
#для_продвинутых
std::greater
Шаблон
Функциональный объект
#для_продвинутых
Шаблон
std::greater
представляет собой функциональный объект, который используется для сравнения двух объектов по возрастанию. Он является базовым классом для всех функциональных объектов, которые выполняют сравнение по возрастанию, например, std::less
, std::greater_equal
, std::less_equal
.Функциональный объект
std::greater
имеет один метод, operator()
, который принимает два аргумента типа T
и возвращает значение типа bool
. Значение true
возвращается, если первый аргумент больше второго, и значение false
— в противном случае.#для_продвинутых
std::utility
Одним из наиболее важных шаблонов в
#для_продвинутых
std::utility
— это пространство имен в стандартном заголовочном файле <utility>
, которое содержит шаблоны функций и классов, которые предоставляют различные полезные утилиты для работы с данными.Одним из наиболее важных шаблонов в
std::utility
является шаблон класса pair, который представляет собой пару значений. pair может использоваться для хранения двух значений любого типа.#для_продвинутых
Функция strlen()
Функция
Синтаксис функции
Аргументы:
Возвращаемое значение:
Количество символов в строке, включая нулевой символ
Функция
strlen()
в языке программирования C++ используется для определения длины строки. Она принимает в качестве аргумента указатель на строку и возвращает значение типа size_t
, которое представляет собой количество символов в строке, включая нулевой символ \0
, который завершает строку.Синтаксис функции
strlen()
:size_t strlen(const char* str);
Аргументы:
str
— указатель на строку, длина которой должна быть определена.Возвращаемое значение:
Количество символов в строке, включая нулевой символ
\0
.std::sort
Начальный итератор — указывает на начало диапазона элементов, который необходимо отсортировать.
Конечный итератор — указывает на конец диапазона элементов, который необходимо отсортировать.
Компаратор — функция, которая определяет, какой элемент из двух меньше или равен другому.
Если компаратор не указан, то функция использует стандартную лексикографическую сортировку.
#для_продвинутых
std::sort
— это функция стандартной библиотеки C++, которая сортирует диапазон элементов. Функция принимает три параметра:Начальный итератор — указывает на начало диапазона элементов, который необходимо отсортировать.
Конечный итератор — указывает на конец диапазона элементов, который необходимо отсортировать.
Компаратор — функция, которая определяет, какой элемент из двух меньше или равен другому.
Если компаратор не указан, то функция использует стандартную лексикографическую сортировку.
#для_продвинутых
std::semaphore
В примере на картинке два потока пытаются получить доступ к ресурсу. Первый поток получает доступ к ресурсу, используя
#для_продвинутых
std::semaphore
— это класс шаблона в C++ <semaphore>
, представляющий собой примитив синхронизации, который позволяет контролировать доступ к совместно используемым ресурсам. В отличие от std::mutex
, std::semaphore
позволяет более чем одному потоку одновременно обращаться к одному и тому же ресурсу, но не более, чем указано в конструкторе.std::semaphore
имеет два основных метода:acquire()
— блокирует поток, пока значение счетчика семафора не станет ненулевым.release()
— увеличивает значение счетчика семафора на единицу.В примере на картинке два потока пытаются получить доступ к ресурсу. Первый поток получает доступ к ресурсу, используя
acquire()
, и освобождает его, используя release()
. Второй поток также пытается получить доступ к ресурсу, но блокируется, пока первый поток не освободит его. После того, как первый поток освободит ресурс, второй поток также сможет получить к нему доступ.#для_продвинутых
input_iterator
В C++ понятие итератора используется для доступа к элементам контейнера. Итераторы могут быть разных типов, каждый из которых имеет свои собственные свойства и ограничения.
Итератор
Итераторы
— Они должны поддерживать оператор *, который возвращает значение элемента, на который указывает итератор.
— Они должны поддерживать оператор ++, который перемещает итератор на следующий элемент контейнера.
#для_начинающих
В C++ понятие итератора используется для доступа к элементам контейнера. Итераторы могут быть разных типов, каждый из которых имеет свои собственные свойства и ограничения.
Итератор
input_iterator
представляет собой итератор, который может только читать значения элементов контейнера. Он не может их изменять.Итераторы
input_iterator
должны удовлетворять следующим требованиям:— Они должны поддерживать оператор *, который возвращает значение элемента, на который указывает итератор.
— Они должны поддерживать оператор ++, который перемещает итератор на следующий элемент контейнера.
#для_начинающих
#вопросы_с_собеседований
Объясните концепцию и применение шаблонов политик в C++ и как они способствуют принципам проектирования, основанным на композиции вместо наследования
Шаблоны политик в C++ представляют собой технику проектирования, при которой поведение класса параметризуется через шаблоны. Это позволяет программистам выбирать или изменять аспекты поведения класса на этапе компиляции, вставляя разные "политики" — это могут быть классы или функции, определяющие определённые аспекты поведения. Этот подход способствует гибкости и повторному использованию кода, позволяя композицию поведения вместо жёсткого наследования. Он также помогает уменьшить связность кода и увеличивает его модульность, поскольку изменения в одной политике не влияют на другие.
Объясните концепцию и применение шаблонов политик в C++ и как они способствуют принципам проектирования, основанным на композиции вместо наследования
Шаблоны политик в C++ представляют собой технику проектирования, при которой поведение класса параметризуется через шаблоны. Это позволяет программистам выбирать или изменять аспекты поведения класса на этапе компиляции, вставляя разные "политики" — это могут быть классы или функции, определяющие определённые аспекты поведения. Этот подход способствует гибкости и повторному использованию кода, позволяя композицию поведения вместо жёсткого наследования. Он также помогает уменьшить связность кода и увеличивает его модульность, поскольку изменения в одной политике не влияют на другие.
#вопросы_с_собеседований
Как работает механизм перегрузки операторов в C++ и какие ограничения существуют при его использовании?
В C++ перегрузка операторов позволяет программистам определять поведение стандартных операторов (например, +, -, *, /) для пользовательских типов данных. Это делается путем определения функций или методов класса с специальным именем: operatorX, где X - это оператор, который нужно перегрузить. Однако существуют ограничения: нельзя перегружать операторы для встроенных типов данных (только если одним из операндов является пользовательский тип), нельзя создавать новые операторы, и некоторые операторы (например, ?:, .) не подлежат перегрузке. Перегрузка операторов должна использоваться с осторожностью, чтобы не нарушить интуитивные ожидания от работы этих операторов.
Как работает механизм перегрузки операторов в C++ и какие ограничения существуют при его использовании?
std::thread
Чтобы создать поток, можно использовать конструктор класса
В примере на картинке функция
#для_начинающих
std::thread
— это класс из стандартной библиотеки С++, который представляет собой поток выполнения. Потоки выполнения — это независимые единицы, которые могут выполняться параллельно друг с другом.Чтобы создать поток, можно использовать конструктор класса
std::thread
. Конструктор принимает в качестве аргумента указатель на функцию или объект, который будет выполняться в потоке.В примере на картинке функция
foo()
будет выполняться в отдельном потоке. После создания потока мы вызываем его метод join()
, чтобы дождаться его завершения.#для_начинающих
Библиотека концепций
Библиотека концепций — это набор функций и классов, которые позволяют определять и проверять концепции. Концепция — это набор логических предикатов, которые определяют свойства типа или выражения. Концепции могут использоваться для проверки типов параметров шаблонов, определения совместимости типов и повышения безопасности и надежности кода.
Библиотека концепций была введена в стандарт C++ 20. Она основана на концепциих Boost, которые были реализованы в библиотеке Boost еще в 2005 году.
#для_продвинутых
Библиотека концепций — это набор функций и классов, которые позволяют определять и проверять концепции. Концепция — это набор логических предикатов, которые определяют свойства типа или выражения. Концепции могут использоваться для проверки типов параметров шаблонов, определения совместимости типов и повышения безопасности и надежности кода.
Библиотека концепций была введена в стандарт C++ 20. Она основана на концепциих Boost, которые были реализованы в библиотеке Boost еще в 2005 году.
#для_продвинутых
Концепт IterToComparable
Концепт IterToComparable появился в стандарте C++20 и используется для проверки того, что итератор указывает на объекты, которые можно сравнивать.
Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как
В примере используется концепт
Концепт IterToComparable появился в стандарте C++20 и используется для проверки того, что итератор указывает на объекты, которые можно сравнивать.
Этот концепт позволяет убедиться, что можно сравнивать объекты, на которые ссылается итератор, с помощью операторов сравнения как
<
, <=
, >
, >=
.В примере используется концепт
iter_to_comparable
для проверки, что итератор по std::vector
указывает на сравнимые объекты int
. Это позволяет корректно найти минимальный элемент с помощью std::min_element
.«Код-ревью — это когда твои комментарии в интернете действительно читают»: дискуссия с разработчиками на C++
Смотреть статью
Смотреть статью
Хабр
«Код-ревью — это когда твои комментарии в интернете действительно читают»: дискуссия с разработчиками на C++
Заходят как‑то на Хабр С++ разработчики из крупных компаний, а у них спрашивают: что такое код‑ревью и используют ли они спецификатор final. Эти и другие вопросы...
#вопросы_с_собеседований
Что случится, если вернуть ссылку на временный объект?
Если вернуть ссылку на временный объект, созданный в стеке, то это приведет к неопределенному поведению программы.
После выхода из функции память, выделенная под временный объект, освобождается. И если где-то сохранилась ссылка на этот объект, то при попытке обратиться к нему произойдет ошибка.
Что случится, если вернуть ссылку на временный объект?
После выхода из функции память, выделенная под временный объект, освобождается. И если где-то сохранилась ссылка на этот объект, то при попытке обратиться к нему произойдет ошибка.
spaceship operator
Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.
Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например
— Читабельнее и компактнее кода с традиционными операторами сравнения.
Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.
Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например
std::sort
.— Читабельнее и компактнее кода с традиционными операторами сравнения.
#вопросы_с_собеседований
Как подсчитать количество элементов в std::list?
Чтобы подсчитать количество элементов в std::list, можно использовать следующие способы:
1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.
Как подсчитать количество элементов в std::list?
1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.
Библиотека <pty.h>
Библиотека
#для_начинающих
Библиотека
<pty.h>
используется для работы с псевдотерминалами (PTY — Pseudo Terminal). Псевдотерминалы предоставляют средство для создания пары устройств, одно из которых может использоваться как мастер (master), а другое как рабочее (slave). Процессы могут обмениваться данными между этими устройствами, эмулируя терминальные взаимодействия.#для_начинающих