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). Процессы могут обмениваться данными между этими устройствами, эмулируя терминальные взаимодействия.#для_начинающих
Функция 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
можно почитать здесь.#вопросы_с_собеседований
Что выведет код сверху?
Ответ:
10 99 40 99
В этой программе мы меняем местами определенные значения в двух векторах с помощью iter_swap.
Что выведет код сверху?
Ответ:
В этой программе мы меняем местами определенные значения в двух векторах с помощью iter_swap.
Видеоуроки по созданию игры на C++
Серия видео, в которой автор по шагам рассказывает, как написать свою игру на C++.
Смотреть статью
Серия видео, в которой автор по шагам рассказывает, как написать свою игру на C++.
Смотреть статью
Преобразование списка в массив в C++
Простое решение состоит в том, чтобы использовать цикл for на основе диапазона для обхода списка и, один за другим, добавлять каждый элемент в следующий доступный индекс в массиве.
Другой способ преобразование можно найти здесь.
Простое решение состоит в том, чтобы использовать цикл for на основе диапазона для обхода списка и, один за другим, добавлять каждый элемент в следующий доступный индекс в массиве.
Другой способ преобразование можно найти здесь.