Библиотека собеса по C++ | вопросы с собеседований
4.68K subscribers
387 photos
2 videos
168 links
Вопросы с собеседований по C++ и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/9ccf302b

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
-35% на курс по алгоритмам

🎄 Новый год начинается с подарков, а хороший подарок для себя — новые знания со скидкой 35%!

🌟«Алгоритмы и структуры данных» — 23 390 ₽ (вместо 35 990 ₽)

Полугодовая программа от преподавателей МФТИ и НИУ ВШЭ, которая включает в себя все необходимые знания по алгоритмам для работы.

Самое ценное — это развернутая обратная связь по всем вашим домашним заданиям, а также ссылки на полезные дополнительные материалы.

У вас не будет шансов не усвоить какие-то темы курса👌

🔥 Переходите и активируйте вводные занятия курсаhttps://proglib.io/w/ff97c30a
std::thread

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

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

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

Рассмотрим пример кода, который демонстрирует использование шаблонных классов, рекурсивных функций и концепций метапрограммирования на уровне компиляции. Этот код вычисляет факториал числа во время компиляции.

1. Определяется шаблонный класс Factorial, который использует рекурсивные шаблонные инстанциации для вычисления факториала числа N.
2. В классе Factorial используется рекурсивный вызов, где Factorial определяется через N * Factorial.
3. Специализация шаблона Factorial определяет базовый случай рекурсии, устанавливая значение факториала 0 равным 1.
4. В функции main выводятся значения факториалов для чисел 5 и 10.

Этот пример демонстрирует мощь метапрограммирования в C++ и как можно выполнить сложные вычисления на этапе компиляции, что потенциально ускоряет время выполнения программы.
RCU

RCU (Read-Copy-Update) — это техника синхронизации в многозадачных программах, предназначенная для обеспечения эффективного доступа к данным в условиях высокой параллельности. RCU позволяет одновременно выполнять чтение данных без блокировки и обновление данных, минимизируя при этом конфликты доступа.

В примере на картинке rcu_dereference используется для чтения данных без блокировки, а rcu_assign_pointer для обновления указателя на данные. Функция call_rcu используется для планирования освобождения старых данных после завершения работы с ними.
std::any_cast

std::any_cast используется для приведения объектов типа std::any к конкретному типу данных во время выполнения программы.

Класс std::any может хранить данные любого типа, но при этом теряется информация о реальном типе данных.
Чтобы получить эти данные обратно в изначальный тип, и используется std::any_cast. Он проверяет, совместим ли хранимый в std::any объект с запрошенным целевым типом.
Если совместим — возвращает ссылку на данные нужного типа.

Например, если в std::any был помещен объект типа int, то с помощью std::any_cast этот int можно получить обратно в переменную типа int. Аналогично для других типов данных.
Битовые поля

Битовые поля (bit fields) позволяют использовать определенное количество битов для хранения данных в структурах или классах. Это может быть полезным, если вам нужно экономить память или если вы работаете с данными, которые представляют собой битовые флаги.
#код
Может ли inline-функция быть рекурсивной в С++?

Да, inline-функция может быть рекурсивной в С++. Однако, компилятор может отказаться от встраивания рекурсивной функции, если это приведет к чрезмерному расходу памяти или времени.

Чтобы заставить компилятор встроить рекурсивную функцию, можно использовать директиву препроцессора #pragma inline_recursion(on).

На картинке выше функция вычисляет факториал числа. При компиляции этой функции с помощью компилятора GCC с опцией -O2 будет получен следующий результат:

factorial(int) at factorial.cc:5

Это означает, что функция factorial будет встроена в код.

Однако, если компилятор считает, что встраивание рекурсивной функции приведет к чрезмерному расходу памяти или времени, он может отказаться от этого. Например, если функция factorial вызывается очень часто, компилятор может решить, что встраивание функции приведет к избыточному дублированию кода. В этом случае компилятор будет использовать обычный вызов функции.
Функция strrchr()

Функция strrchr() является частью стандартной библиотеки C и C++. Она используется для поиска последнего вхождения указанного символа в строке, представленной в виде массива символов (строки).

Параметры функции включают:

str (const char*): Указатель на строку, в которой будет выполнен поиск.
character (int): Символ, который вы ищете в строке.
Функция strrchr() возвращает указатель на последнее вхождение символа character в строке str. Если символ не найден, то функция возвращает нулевой указатель (nullptr).
Концепт Derived

Концепт std::derived_from используется для проверки того, является ли один тип производным от другого. Он был введен в C++20.
Концепт позволяет проверить, является ли тип Т производным от базового типа. Может использоваться в качестве ограничения шаблона для разрешения использования только производных типов

Заменяет использование std::is_base_of в коде шаблонов и часто применяется для указания в шаблонах и концептах, что параметр T должен быть производным от некоторого базового типа.
Что такое явное приведение типов?

Явное приведение типов (или явное преобразование типов) — это процесс, при котором программист явно указывает компилятору, что нужно выполнить преобразование значения из одного типа данных в другой. Это может быть полезно, когда нужно убедиться, что данные корректно преобразуются между типами, даже если это может потенциально привести к потере информации или изменению значения.
Алгоритм lexicographic_compare

Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле algorithm.

Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.

Работает для любых типов данных, которые можно сравнивать с помощью <.
Самые полезные каналы для программистов в одной подборке!

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы

#️⃣C#

Библиотека шарписта
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Библиотека Data Science — полезные статьи, новости и обучающие материалы
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие профильные каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика

💼Каналы с вакансиями

Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

🤖Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ
std::memory_order_acquire

std::memory_order_acquire — это один из флагов (memory order) в стандартной библиотеке C++, который используется в контексте многопоточности и атомарных операций. Он указывает, что операция должна выполняться с учетом уровня доступа к памяти, который предписывает, что все чтения, выполняемые перед этой операцией, должны быть завершены до того, как она начнется. Это означает, что все изменения, сделанные в памяти другими потоками, должны быть видимы для текущей операции.

std::memory_order_acquire применяется обычно к операциям чтения (например, чтение значения из разделяемой переменной), чтобы гарантировать корректное чтение данных из разделяемой памяти в многопоточной среде. В сочетании с std::memory_order_release, этот флаг может использоваться для создания атомарных операций с соблюдением необходимых гарантий согласованности памяти в многопоточной среде.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Функторы

Функтор — это сокращение от функциональный объект, представляющий собой конструкцию, позволяющую использовать объект класса как функцию. В C++ для определения функтора достаточно описать класс, в котором переопределена операция ().

Выгода функтора состоит в том, что:
а). Его можно параметризовать при создании объекта (перед вызовом) используя конструктор объекта с параметрами/
б). Может создаваться временный объект исключительно на время выполнения функционального вызова.
std::byte

std::byte — это тип данных, введенный в стандарт C++17. Он представляет собой один байт, то есть 8 бит. std::byte не является ни типом символа, ни типом числа. Он предназначен для представления байтов в памяти, независимо от того, используются они для хранения символов, чисел или чего-либо еще.

std::byte может использоваться в следующих случаях:
— Для доступа к памяти, занимаемой другими объектами.
— Для работы с низкоуровневыми функциями, такими как чтение и запись в порты ввода-вывода.
— Для реализации собственных типов данных, которые должны хранить байты.
Задача

В текстовом файле, содержащем текст программы на языке Си, проверить соответствие открывающихся и закрывающихся фигурных скобок { и }. Результат проверки вывести на экран и записать в виде фразы в текстовый файл. Результат работы программы (вывод) поместить в отдельный текстовый файл (например, «out . txt " ), продублировав на экране.
Что такое выравнивание данных?

Выравнивание данных (data alignment) — это процесс выравнивания слов памяти в компьютерной системе таким образом, чтобы каждый адрес начала слова был кратен адресу выравнивания для этого слова. Это делается для увеличения производительности, так как доступ к памяти, выровненной по границе слова, выполняется быстрее, чем к памяти с не выровненным доступом.

Большинство компиляторов C++ пытаются генерировать код, который соответствует некоторым правилам выравнивания памяти на конкретном аппаратном обеспечении.
Поиск в ширину

Поиск в ширину (breadth-first search, BFS) — это алгоритм поиска или обхода графа. Он исследует все вершины на одном уровне, прежде чем переходить к следующему уровню.

Этот пример иллюстрирует обход в ширину для следующего графа:
0
/ \
1-----2
\
3
Начиная с вершины 2, алгоритм BFS посетит вершины в следующем порядке: 2, 0, 3, 1.