cookie

ما از کوکی‌ها برای بهبود تجربه مرور شما استفاده می‌کنیم. با کلیک کردن بر روی «پذیرش همه»، شما با استفاده از کوکی‌ها موافقت می‌کنید.

avatar

C/C++ | Вопросы собесов

Разбираем вопросы с собеседований на С/С++ разработчика. Сайт: easyoffer.ru Реклама: @easyoffer_adv

نمایش بیشتر
پست‌های تبلیغاتی
3 225
مشترکین
+524 ساعت
+1907 روز
+1 05630 روز

در حال بارگیری داده...

معدل نمو المشتركين

در حال بارگیری داده...

🤔 Какой метод управления памятью не используется в C++?Anonymous voting
  • new
  • malloc
  • calloc
  • garbage collection
0 votes
👾 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
  • Переменная потоконезависимая
  • Переменная только для чтения
  • Переменная может изменяться
  • Переменная безопасна для потоков
0 votes
👀 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
0 votes
🤯 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
  • Преобразует типы во время компиляции
  • Преобразует указатели на классы по иерархии
  • Изменяет размер массива
  • Генерирует исключения
0 votes
👀 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
0 votes
👍 5🔥 1
یک طرح متفاوت انتخاب کنید

طرح فعلی شما تنها برای 5 کانال تجزیه و تحلیل را مجاز می کند. برای بیشتر، لطفا یک طرح دیگر انتخاب کنید.