C/C++ | Вопросы собесов
Разбираем вопросы с собеседований на С/С++ разработчика. Сайт: easyoffer.ru Реклама: @easyoffer_adv
نمایش بیشتر3 225
مشترکین
+524 ساعت
+1907 روز
+1 05630 روز
- مشترکین
- پوشش پست
- ER - نسبت تعامل
در حال بارگیری داده...
معدل نمو المشتركين
در حال بارگیری داده...
🤔 Какой метод управления памятью не используется в C++?Anonymous voting
- new
- malloc
- calloc
- garbage collection
👾 3😁 2🤔 2
Какой контейнер используется в priority_queue ?
Спросят с вероятностью 17%
priority_queue — это тип контейнера-адаптера, который предоставляет автоматически сортируемую очередь.
priority_queue
обеспечивает доступ к наибольшему элементу, хранящемуся в контейнере, и позволяет добавлять и удалять элементы. Данный контейнер не предоставляет прямого доступа к любому из других его элементов, кроме наибольшего.
Основной контейнер
По умолчанию priority_queue
использует контейнер std::vector
для хранения элементов. Однако priority_queue
предоставляет гибкость в выборе базового контейнера и может быть сконфигурирована для использования любого контейнера, который поддерживает операции доступа к начальному элементу (front()
), добавления в конец (push_back()
), и удаления из конца (pop_back()
). Обычно это std::vector
или std::deque
.
Вы можете указать используемый базовый контейнер в качестве второго параметра шаблона при объявлении priority_queue
. Например, если вы хотите использовать std::deque
вместо std::vector
:
#include <iostream>
#include <queue>
#include <deque>
int main() {
std::priority_queue<int, std::deque<int>> my_priority_queue;
my_priority_queue.push(30);
my_priority_queue.push(100);
my_priority_queue.push(25);
while (!my_priority_queue.empty()) {
std::cout << my_priority_queue.top() << std::endl;
my_priority_queue.pop();
}
return 0;
}
Как он работает
priority_queue
поддерживает свои элементы в сортированном порядке, что позволяет операции извлечения верхнего элемента (top()
) выполняться за время \(O(1)\). Вставка новых элементов (push()
) и удаление верхинего элемента (pop()
) имеют логарифмическую сложность \(O(\log n)\), где \(n\) — количество элементов в контейнере. Сортировка элементов обычно выполняется с использованием функции std::make_heap
, std::push_heap
и std::pop_heap
, которые организуют элементы в структуру данных, называемую двоичной кучей.
priority_queue
использует std::vector
как свой базовый контейнер по умолчанию, но может быть сконфигурирована для использования других контейнеров, таких как std::deque
. Выбор контейнера зависит от требований к производительности и характеристик вашей задачи. Этот контейнер-адаптер обеспечивает эффективное управление приоритетной очередью, которая автоматически упорядочивает свои элементы и обеспечивает быстрый доступ к элементу с наивысшим приоритетом.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 434 вопроса на C/C++ разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых👍 1
🤔 Что означает ключевое слово `volatile` в C++?Anonymous voting
- Переменная потоконезависимая
- Переменная только для чтения
- Переменная может изменяться
- Переменная безопасна для потоков
👀 2👍 1👾 1
Как можно хранить денежный эквивалент используя int ?
Спросят с вероятностью 17%
Хранение денежных значений с использованием целочисленных типов данных (
int
, long
, int64_t
) — это надежный и распространенный способ избежать проблем с точностью, присущих числам с плавающей точкой. Основная идея состоит в том, чтобы хранить деньги в минимальных единицах валюты, таких как центы для долларов или копейки для рублей.
Допустим, у нас есть цена в долларах и центах. Вместо использования float
или double
, мы можем хранить цену в целых числах, представляющих количество центов. Например, цена $12.99 будет храниться как 1299 центов.
Пример кода
#include <iostream>
#include <iomanip> // Для управления выводом
class Money {
public:
// Конструктор принимает цену в долларах и центах
Money(int dollars, int cents) : totalCents(dollars * 100 + cents) {}
// Конструктор принимает цену в виде float
explicit Money(float amount) : totalCents(static_cast<int>(amount * 100 + 0.5f)) {}
// Получение долларов и центов из totalCents
int getDollars() const {
return totalCents / 100;
}
int getCents() const {
return totalCents % 100;
}
// Вывод цены
void print() const {
std::cout << "$" << getDollars() << "."
<< std::setw(2) << std::setfill('0') << getCents() << std::endl;
}
// Перегрузка операторов для арифметических операций
Money operator+(const Money& other) const {
return Money(0, totalCents + other.totalCents);
}
Money operator-(const Money& other) const {
return Money(0, totalCents - other.totalCents);
}
private:
int totalCents;
};
int main() {
Money price1(12, 99); // $12.99
Money price2(7, 50); // $7.50
Money total = price1 + price2;
std::cout << "Цена 1: ";
price1.print();
std::cout << "Цена 2: ";
price2.print();
std::cout << "Общая цена: ";
total.print();
return 0;
}
Объяснение
1️⃣Класс Money:
✅Хранит сумму денег в виде целого числа (totalCents
), представляющего количество центов.
2️⃣Конструкторы:
✅Один конструктор принимает доллары и центы отдельно.
✅Другой конструктор принимает float
значение и преобразует его в центы.
3️⃣Методы getDollars и getCents:
✅Позволяют получить доллары и центы из общего количества центов.
4️⃣Метод print:
✅Выводит цену в формате $доллары.центы, используя манипуляторы вывода для форматирования.
5️⃣Перегрузка операторов:
✅Перегруженные операторы + и - позволяют выполнять арифметические операции с объектами Money.
Преимущества использования целых чисел для хранения денежных значений
1️⃣Точность:
✅Нет проблем с ошибками округления, как у чисел с плавающей точкой.
2️⃣Простота:
✅Арифметические операции с целыми числами проще и быстрее.
3️⃣Безопасность:
✅Нет потерь точности при конвертации между двоичной и десятичной системами.
Использование целых чисел для хранения денежных значений является надежным и эффективным способом избежать проблем с точностью. Это особенно важно для финансовых приложений, где точность вычислений критически важна. Хранение денег в минимальных единицах валюты (центах или копейках) обеспечивает точность и простоту операций.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 434 вопроса на C/C++ разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых👍 8🔥 3
Photo unavailableShow in Telegram
⚡️В сети начали находить курсы и книги известных онлайн школ в открытом доступе
Вот отсортированная база с тонной материала(постепенно пополняется):
🔗 БАЗА (3385 видео):
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(352 видео, 89 книги) — С++
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL
(163 видео, 29 книги) — Linux
(363 видео, 122 книги) — Python
(415 видео, 168 книги) — Frontend
(143 видео, 33 книги) — Flask
(167 видео, 43 книги) — Django
(197 видео, 49 книги) — Разработка ботов
(137 видео, 93 книги) — Data Science
(113 видео, 82 книги) — GameDev
(129 видео, 73 книги) — QA
Скачивать ничего не нужно — все выложили в Telegram и на YouTube с доступом по ссылке
❤ 1
🤔 Какой оператор C++ не поддерживает?Anonymous voting
- goto
- sizeof
- instanceof
- new
🤯 6❤ 3
Что известно о spinlock и deadlock ?
Спросят с вероятностью 17%
spinlock и deadlock описывают различные аспекты управления доступом к ресурсам и синхронизации. Оба эти термина относятся к блокировкам, но имеют существенно разные цели и поведение.
Spinlock — это один из простейших механизмов блокировки, который активно ожидает освобождения блокировки, постоянно проверяя её состояние в цикле. Это "занятное ожидание" (busy waiting) продолжается до тех пор, пока другой поток не освободит блокировку.
Основные особенности:
✅Производительность: Полезен в ситуациях, где блокировка не будет удерживаться долго, и затраты на активное ожидание оправданы, поскольку это может быть быстрее, чем обращение к механизмам планировщика ОС для управления блокировками.
✅Ресурсоёмкость: Использование его может быть ресурсоёмким, так как поток, ожидающий освобождения блокировки, постоянно занимает процессорное время.
✅Применение: Часто используется в ядрах операционных систем и в сценариях, где потоки выполняются на отдельных процессорах или ядрах, что минимизирует влияние активного ожидания на общую производительность системы.
Deadlock (взаимная блокировка) — это ситуация в многопоточке, когда два или более процессов бесконечно ожидают ресурсы, занятые друг другом, что приводит к полной остановке выполнения задач.
Основные особенности:
✅Условия возникновения: Для возникновения взаимной блокировки должны быть выполнены четыре условия: взаимное исключение (mutual exclusion), удержание и ожидание (hold and wait), отсутствие отзыва (no preemption), и круговое ожидание (circular wait).
✅Решение проблемы: Избежать его можно путём предотвращения одного или нескольких из этих условий. Например, можно устранить круговое ожидание, упорядочивая порядок, в котором потоки могут захватывать блокировки.
✅Обнаружение и восстановление: Операционные системы и некоторые разработчики приложений используют различные алгоритмы для обнаружения и восстановления после взаимной блокировки, включая принудительное завершение одного из застрявших процессов.
Spinlock и deadlock имеют важное значение в многопоточном программировании. Spinlock используется для коротких операций блокировки, где накладные расходы на планирование и переключение контекста могут превысить затраты на активное ожидание. Deadlock является критической проблемой, которая может привести к остановке приложений и требует тщательного проектирования и управления для её предотвращения.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 434 вопроса на C/C++ разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🤔 4👍 1
🤔 Что делает оператор `dynamic_cast<>` в C++?Anonymous voting
- Преобразует типы во время компиляции
- Преобразует указатели на классы по иерархии
- Изменяет размер массива
- Генерирует исключения
👀 4👍 1
Зачем нам нужна move семантика ?
Спросят с вероятностью 17%
Move семантика введена с целью повышения эффективности работы с ресурсами, такими как память, файлы, сокеты и другие объекты, которые занимают значительные ресурсы. Она позволяет избежать ненужного копирования объектов, что может быть дорогостоящим как по времени, так и по памяти.
Зачем она нужна?
1️⃣Эффективность работы с ресурсами: Копирование больших объектов может быть очень затратным. Move семантика позволяет перенести ресурсы от одного объекта к другому без дорогостоящего копирования.
2️⃣Улучшение производительности: Перемещение (move) быстрее копирования, поскольку оно всего лишь переназначает указатели на ресурсы, вместо создания их копий. Это особенно важно в приложениях с высокой производительностью, таких как игры, обработка видео, базы данных.
Как это используется?
Move семантика реализуется с помощью rvalue ссылок (ссылок на временные объекты) и специальных методов — move конструктора и move оператора присваивания.
Пример кода:
#include <iostream>
#include <vector>
class MyClass {
public:
int* data;
size_t size;
// Конструктор
MyClass(size_t s) : size(s), data(new int[s]) {
std::cout << "Constructing MyClass\n";
}
// Деструктор
~MyClass() {
delete[] data;
std::cout << "Destructing MyClass\n";
}
// Move конструктор
MyClass(MyClass&& other) noexcept : data(other.data), size(other.size) {
other.data = nullptr; // Обнуляем указатель у "старого" объекта
other.size = 0;
std::cout << "Move constructing MyClass\n";
}
// Move оператор присваивания
MyClass& operator=(MyClass&& other) noexcept {
if (this != &other) {
delete[] data; // Освобождаем старый ресурс
data = other.data;
size = other.size;
other.data = nullptr; // Обнуляем указатель у "старого" объекта
other.size = 0;
std::cout << "Move assigning MyClass\n";
}
return *this;
}
};
int main() {
MyClass a(10); // Создаем объект a
MyClass b = std::move(a); // Перемещаем ресурсы от a к b
return 0;
}
Объяснение кода:
1️⃣Конструктор: Создает объект с заданным размером.
2️⃣Деструктор: Освобождает ресурсы.
3️⃣Move конструктор: Перемещает ресурсы от одного объекта к другому, обнуляя указатели на ресурсы у старого объекта.
4️⃣Move оператор присваивания: Аналогично move конструктору, но используется для уже существующих объектов.
Move семантика нужна для повышения производительности и эффективности работы с ресурсами. Она позволяет перемещать ресурсы между объектами без их копирования, что экономит время и память.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 434 вопроса на C/C++ разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых👍 4😁 1
🤔 Какой механизм в C++ используется для прямого управления памятью?Anonymous voting
- Гарбаж коллектор
- Автоматическое выделение
- new и delete
- Smart pointers
👍 5🔥 1
یک طرح متفاوت انتخاب کنید
طرح فعلی شما تنها برای 5 کانال تجزیه و تحلیل را مجاز می کند. برای بیشتر، لطفا یک طرح دیگر انتخاب کنید.