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

По вопросам сотрудничества: @adv_and_pr
Download Telegram
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.
— Читабельнее и компактнее кода с традиционными операторами сравнения.
#вопросы_с_собеседований
Как подсчитать количество элементов в std::list?

Чтобы подсчитать количество элементов в std::list, можно использовать следующие способы:

1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.
Библиотека <pty.h>

Библиотека <pty.h> используется для работы с псевдотерминалами (PTY — Pseudo Terminal). Псевдотерминалы предоставляют средство для создания пары устройств, одно из которых может использоваться как мастер (master), а другое как рабочее (slave). Процессы могут обмениваться данными между этими устройствами, эмулируя терминальные взаимодействия.

#для_начинающих
Функция ptsname()

Функция ptsname() возвращает имя подчиненного псевдотерминального устройства, соответствующего главному устройству, на которое ссылается файловый дескриптор fd.

Функция ptsname_r() является реентерабельным эквивалентном ptsname(). Она сохраняет имя устройства подчинённого псевдо-терминала в виде строки (завершающейся null) в буфер, указанный в buf. В аргументе buflen задаётся количество байт, доступных в buf.

#для_начинающих
Функция div()

Функция div() вычисляет величину numerator/denominator и возвращает частное и остаток в структуре div_t, которая содержит два целочисленных поля (в неопределённом порядке) quot и rem. Частное округляется до ближайшего нуля. Результат равняется quot*denominator+rem = numerator.

Функции ldiv(), lldiv() и imaxdiv() выполняют эту же функцию, деля числа соответствующего типа и возвращая результат в структуре с соответствующим именем, всегда с полями quot и rem того же типа, что и аргументы функции.

#для_начинающих
Алгоритм random_shuffle

Он случайным образом переставляет элементы в диапазоне [первый, последний).

Алгоритм меняет значение каждого элемента на какой-либо другой случайно выбранный элемент.

Про различия между shuffle и random_shuffle можно почитать здесь.
Узнаем размер файла с помощью C++

В этом примере мы открываем файл example.txt с помощью ifstream, перемещаем указатель на конец файла с помощью функции seekg, а затем получаем текущую позицию (размер файла) с помощью функции tellg. Результат выводится на экран.
#вопросы_с_собеседований
Что выведет код сверху?

Ответ:
10 99 40 99

В этой программе мы меняем местами определенные значения в двух векторах с помощью iter_swap.
Видеоуроки по созданию игры на C++

Серия видео, в которой автор по шагам рассказывает, как написать свою игру на C++.

Смотреть статью
Преобразование списка в массив в C++

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

Другой способ преобразование можно найти здесь.