Библиотека собеса по 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
加入频道
Что такое SIMD-инструкции?

SIMD-инструкции — это специальные команды процессора, которые работают с векторными регистрами и могут выполнять одну операцию над несколькими элементами данных параллельно.

Например, при сложении двух векторов из 4 float чисел, вместо 4 инструкций сложения, с SIMD можно выполнить одну команду, которая сложит эти вектора за одну операцию.

Основные преимущества SIMD:
— Повышение производительности за счет параллельных вычислений.
— Эффективное использование пропускной способности процессора.
— Уменьшение количества инструкций за счет векторизации.
— Оптимизация алгоритмов обработки массивов, матриц, фильтрации, графики.
Как работают константные методы?

Константные методы — это методы, которые помечены модификатором final. Это означает, что тело метода не может быть переопределено в подклассах.

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

Основные характеристики константных методов:
— Могут вызываться на экземплярах класса, так как не являются статическими.
— Может обращаться к полям класса, даже нестатическим, т. к. вызывается на объекте класса.
— Может вызывать другие методы класса, в том числе не константные.
— Сигнатура константного метода в подклассе должна полностью совпадать с сигнатурой в суперклассе, иначе это будет перегрузка, а не переопределение.
Что делает данный код?

Правильный ответ: ничего не делает.

int main() // Функция main без аргументов.
{
[] // Объявление лямбда-функции без списка захвата...
() // ... с пустым списком аргументов ...
{} // ... и пустым телом, ...
(); // ... которая тут же вызывается.
}
Алгоритм compare

Если вызывающая строка меньше строки s, то функция возвращает -1 (отрицательное значение). Если вызывающая строка больше строки s, функция возвращает 1 (положительное значение). Если две строки равны, функция возвращает 0.
🧠Чему вы бы хотели научиться?

Расскажите нам о ваших пожеланиях: какие навыки вы хотели бы прокачать в ближайшее время или какую профессию хотели бы приобрести?

За прохождение опроса вы получите промокод на скидку 15% на все наши курсы до конца 2024 года.

👉Опрос по ссылке👈
Создайте класс Rectangle с двумя закрытыми членами данных для длины и ширины. Добавьте конструктор по умолчанию, конструктор с параметрами и методы для расчета площади и периметра прямоугольника. Затем напишите функцию main, в которой создается объект класса Rectangle, используя динамическое выделение памяти, и выводятся площадь и периметр прямоугольника.

1) Класс Rectangle: Класс имеет два закрытых члена для длины и ширины. Он включает в себя конструктор по умолчанию и конструктор с параметрами.
2) Методы area и perimeter: Эти методы вычисляют площадь и периметр прямоугольника соответственно.

3) Динамическое Выделение Памяти: В функции main создается объект rect класса Rectangle с использованием оператора new. Это позволяет объекту сохранять свое состояние во время выполнения программы до явного освобождения памяти.
4) Вывод и Освобождение Памяти: Выводятся площадь и периметр, после чего освобождается память, выделенная для rect, с помощью оператора delete.
Метод find_last_not_of

Ищет в данной строке последнее появление символа, отличного от символов строки str. Способы вызова и возвращаемое значение аналогичны методу find_first_of.
libpq

libpq — это библиотека, предоставляющая интерфейс для работы с PostgreSQL на уровне языка C. Для использования libpq в C++ вы можете взаимодействовать с библиотекой так, как если бы это был код на C, но также можно воспользоваться некоторыми возможностями C++, чтобы упростить код.

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

insert_or_assign — это функция из стандартной библиотеки языка C++, добавленная в C++17. Она используется для вставки элемента в ассоциативный контейнер (например, std::map) или обновления значения элемента, если ключ уже существует.

Преимущества перед operator[]:

— Более безопасна, так как проверяет существование элемента.
— Избавляет от лишнего кода для проверки наличия ключа.
Функция value_or

Функция value_or используется для получения значения из объекта типа std::optional.

Класс std::optional позволяет хранить значение или отсутствие значения.
Чтобы получить это значение из optional, обычно используют метод value(). Но если значения нет, это выбросит исключение.

Чтобы избежать исключения при отсутствии значения, можно воспользоваться функцией value_or. Она принимает объект std::optional и значение по умолчанию.
Если в optional есть значение — возвращается оно. Если значения нет — возвращается значение по умолчанию.
В чем разница между статической и динамической библиотеками?

Статические и динамические библиотеки — это два основных типа библиотек, используемых в программировании на C++ (и в других языках программирования).

Статические библиотеки:
— Имеют расширение «.lib» (на платформе Windows) или «.a» (на платформах, таких как Linux).
— Код из статических библиотек копируется в исполняемый файл (или в другую статическую библиотеку) в момент компиляции. Это означает, что код библиотеки становится частью исполняемого файла.
Преимущества: Приложение не зависит от внешних библиотек во время выполнения, что делает его более портативным и проще в распространении.
Недостатки: Увеличивает размер исполняемого файла, и любые изменения в коде библиотеки требуют повторной компиляции всего приложения.

Динамические библиотеки:
— Имеют расширение «.dll» (на платформе Windows) или «.so» (на платформах, таких как Linux).
— Код из динамической библиотеки загружается в память во время выполнения программы. Это означает, что библиотека остается внешней и может быть загружена и выгружена во время выполнения.
Преимущества: Экономия памяти, так как код библиотеки не дублируется в каждом исполняемом файле. Легче обновлять библиотеки без перекомпиляции всего приложения.
Недостатки: Приложение зависит от наличия соответствующих динамических библиотек в системе во время выполнения. Требуется управление версиями и обработка конфликтов.
-35% на курс по алгоритмам

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

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

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

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

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

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

libusb — это библиотека, предназначенная для взаимодействия с устройствами через USB. Она предоставляет программный интерфейс для работы с USB-устройствами на низком уровне. Если вы хотите использовать libusb в своем проекте на C++, вам нужно будет включить соответствующие заголовочные файлы и использовать функции из библиотеки.
Как запретить наследовать класс?

Чтобы запретить наследование класса в C++, вы можете объявить класс как final.

Ключевое слово final указывает компилятору, что класс не может быть использован в качестве базового класса для других классов. Если попытаться наследовать от класса, объявленного как final, компилятор выдаст ошибку.

class Base final {
// ...
};

class Derived : public Base {
// ...
};
// Ошибка компиляции: класс Base объявлен как final
atoll

Функция atoll в языке программирования C++ является функцией библиотеки заголовка cstdlib. Она используется для преобразования строки в значение типа long long int.

В этом примере кода мы считываем строку с помощью функции fgets, а затем преобразуем ее в значение типа long long int с помощью функции atoll. Затем мы выводим полученное значение и его удвоенное значение.
Результат работы этого кода будет зависеть от того, какое значение будет введено пользователем.
std::initializer_list

Присваивайте значения контейнерам непосредственно с помощью списка инициализаторов, как это можно делать с C-массивами.

Это справедливо и для вложенных контейнеров. Скажите спасибо С++11.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

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

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

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

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

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

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

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

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

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

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