Senior C++ Developer
12.9K subscribers
1.29K photos
3 videos
587 links
№ 4931128893
Изучаем C++.

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

std::promise — это шаблонный класс, который предоставляет механизм для связи потока, который обещает предоставить значение в будущем (поставщик), с потоком, который ожидает получение этого значения (потребитель).

Когда создается объект std::promise, он создает связанный объект std::future. Объект std::future предоставляет интерфейс для получения значения или исключения, которое будет предоставлено объектом std::promise.

Поставщик использует методы set_value() или set_exception() для установки значения или исключения, которое будет предоставлено объекту std::promise. Потребитель использует метод get() объекта std::future для получения значения или исключения, которое было установлено поставщиком.

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

std::span — это шаблонный класс, который представляет собой непрерывное представление последовательности объектов. Он был введен в стандарт С++20 и предоставляет безопасный и эффективный способ доступа к элементам такой последовательности.

Тип std::span имеет два шаблонных параметра:

T — тип элементов последовательности.
Extent — количество элементов последовательности. Если этот параметр не указан, то он считается равным dynamic_extent, что означает, что количество элементов не известно заранее.

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

Шаблонный класс std::duration в С++ представляет собой интервал времени. Он состоит из двух частей:

— Количество периодов (tick count) типа Rep.
— Период тика (tick period), который представляет собой дробное число секунд, приходящееся на один тик.

Стандартная библиотека C++ предоставляет ряд предопределенных типов интервалов времени, таких как seconds, minutes, hours, days, weeks, months и years. Эти типы имеют следующие значения периода тика (2 картинка).

#для_начинающих
std::nexttoward()

Функция 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++ понятие итератора используется для доступа к элементам контейнера. Итераторы могут быть разных типов, каждый из которых имеет свои собственные свойства и ограничения.

Итератор input_iterator представляет собой итератор, который может только читать значения элементов контейнера. Он не может их изменять.

Итераторы input_iterator должны удовлетворять следующим требованиям:
— Они должны поддерживать оператор *, который возвращает значение элемента, на который указывает итератор.
— Они должны поддерживать оператор ++, который перемещает итератор на следующий элемент контейнера.

#для_начинающих
#вопросы_с_собеседований
Объясните концепцию и применение шаблонов политик в C++ и как они способствуют принципам проектирования, основанным на композиции вместо наследования


Шаблоны политик в C++ представляют собой технику проектирования, при которой поведение класса параметризуется через шаблоны. Это позволяет программистам выбирать или изменять аспекты поведения класса на этапе компиляции, вставляя разные "политики" — это могут быть классы или функции, определяющие определённые аспекты поведения. Этот подход способствует гибкости и повторному использованию кода, позволяя композицию поведения вместо жёсткого наследования. Он также помогает уменьшить связность кода и увеличивает его модульность, поскольку изменения в одной политике не влияют на другие.
#вопросы_с_собеседований
Как работает механизм перегрузки операторов в C++ и какие ограничения существуют при его использовании?

В C++ перегрузка операторов позволяет программистам определять поведение стандартных операторов (например, +, -, *, /) для пользовательских типов данных. Это делается путем определения функций или методов класса с специальным именем: operatorX, где X - это оператор, который нужно перегрузить. Однако существуют ограничения: нельзя перегружать операторы для встроенных типов данных (только если одним из операндов является пользовательский тип), нельзя создавать новые операторы, и некоторые операторы (например, ?:, .) не подлежат перегрузке. Перегрузка операторов должна использоваться с осторожностью, чтобы не нарушить интуитивные ожидания от работы этих операторов.
std::thread

std::thread — это класс из стандартной библиотеки С++, который представляет собой поток выполнения. Потоки выполнения — это независимые единицы, которые могут выполняться параллельно друг с другом.

Чтобы создать поток, можно использовать конструктор класса std::thread. Конструктор принимает в качестве аргумента указатель на функцию или объект, который будет выполняться в потоке.

В примере на картинке функция foo() будет выполняться в отдельном потоке. После создания потока мы вызываем его метод join(), чтобы дождаться его завершения.

#для_начинающих
Библиотека концепций

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

Библиотека концепций была введена в стандарт C++ 20. Она основана на концепциих Boost, которые были реализованы в библиотеке Boost еще в 2005 году.

#для_продвинутых
Концепт IterToComparable

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

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

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

Если вернуть ссылку на временный объект, созданный в стеке, то это приведет к неопределенному поведению программы.

После выхода из функции память, выделенная под временный объект, освобождается. И если где-то сохранилась ссылка на этот объект, то при попытке обратиться к нему произойдет ошибка.
spaceship operator

Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.

Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например std::sort.
— Читабельнее и компактнее кода с традиционными операторами сравнения.