и посмотреть медиа
C/C++ - вопросы собесов
и посмотреть медиа
Вопросы собесов C/C++.
bot de IA para clonar texto a voz y voz en Telegram. Cree audio utilizando la red neuronal de forma rápida y fácil.
Вопросы для собеседований по C/C++.
🤔 Асимптотическая сложность в list? std::list — это двусвязный список, где каждый элемент хранит ссылку на предыдущий и следующий элементы. Это даёт эффективное добавление и удаление элементов в любой части списка, но делает доступ по индексу медленным 🚩Разбор операций в `std::list` с примерами Добавление в начало и конец — O(1) std::list lst; lst.push_back(10); // O(1) lst.push_front(5); // O(1) Доступ по индексу — O(n) auto it = std::next(lst.begin(), 2); // O(n), приходится идти от начала std::cout
Открыть канал и посмотреть медиа🤔 Что такое абстрактный класс? Это класс, который содержит хотя бы одну чисто виртуальную функцию. Он не может быть создан как объект и предназначен для использования в качестве базового класса. Такие классы служат для определения интерфейсов и полиморфного поведения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний
Открыть канал и посмотреть медиа🤔 Почему со стеком работать быстрее чем с кучей? 🟠Управление памятью Стек: Память в стеке управляется автоматически. Когда вызывается функция, память для её локальных переменных выделяется одним блоком при входе в функцию и освобождается при выходе из неё. Эта операция выполняется за постоянное время (O(1)). Куча: Память в куче управляется вручную (программистом) или через автоматическое управление памятью (например, сборщик мусора). Выделение и освобождение памяти в куче требуют поиска подходящего блока памяти, что может занимать больше времени (O(log n) или даже O(n)). 🟠Локальность данных Стек: Данные в стеке расположены компактно и последовательно. Это означает, что доступ к данным будет быстрее из-за лучшего использования кэш-памяти процессора. Куча: Данные в куче могут быть фрагментированы, что приводит к меньшей эффективности кэширования и увеличению времени доступа. 🟠Предсказуемость Стек: Память в стеке выделяется и освобождается в строго определённом порядке (LIFO - Last In, First Out). Это делает операции со стеком предсказуемыми и упрощает управление памятью. Куча: Память в куче может выделяться и освобождаться в произвольном порядке, что приводит к фрагментации и усложняет управление памятью. 🟠Минимизация накладных расходов Стек: Операции выделения и освобождения памяти на стеке имеют минимальные накладные расходы, так как это просто смещение указателя стека. Куча: Операции выделения и освобождения памяти в куче требуют более сложных алгоритмов и могут включать в себя дополнительные накладные расходы, такие как управление списками свободных блоков и слияние фрагментов. #include void stackFunction() { int stackArray[1000]; // Массив на стеке // Работа с массивом } void heapFunction() { int* heapArray = new int[1000]; // Массив в куче // Работа с массивом delete[] heapArray; // Освобождение памяти } int main() { stackFunction(); // Быстрая работа со стеком heapFunction(); // Медленная работа с кучей return 0; } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое back_inserter, зачем он нужен? std::back_inserter — это адаптер итератора из библиотеки STL, который позволяет удобно добавлять элементы в конец контейнера при использовании алгоритмов стандартной библиотеки (например, std::copy, std::transform и т. д.). Он создает итератор-вставку (inserter iterator), который при попытке записи нового элемента фактически вызывает метод push_back() у контейнера. 🚩Почему он нужен? Обычно алгоритмы STL работают с итераторами и требуют, чтобы целевой контейнер уже содержал достаточно места для копирования или вставки элементов. back_inserter позволяет избежать этого ограничения, автоматически расширяя контейнер по мере необходимости. 🚩Пример использования Без back_inserter (приведет к ошибке!) #include #include #include int main() { std::vector source = {1, 2, 3, 4, 5}; std::vector destination; // Пустой контейнер // Ошибка! У destination нет места для элементов std::copy(source.begin(), source.end(), destination.begin()); return 0; } Используем back_inserter (правильный вариант) #include #include #include #include int main() { std::vector source = {1, 2, 3, 4, 5}; std::vector destination; // Начинаем с пустого контейнера // Используем back_inserter std::copy(source.begin(), source.end(), std::back_inserter(destination)); // Вывод результата for (int num : destination) { std::cout
Открыть канал и посмотреть медиа🤔 Какой контейнер используется в priority_queue? priority_queue в C++ обычно реализован на базе std::vector с использованием кучи (heap) для управления приоритетами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний
Открыть канал и посмотреть медиа🤔 Что будет если вызвать дважды lock()? Если вызвать дважды lock() на одном и том же объекте std::mutex из одного и того же потока, это приведет к взаимной блокировке (deadlock). Это происходит потому, что после первого вызова lock() мьютекс уже будет заблокирован данным потоком, и второй вызов lock() будет ожидать освобождения мьютекса, что никогда не произойдет, так как поток уже заблокировал мьютекс. #include #include #include std::mutex mtx; void threadFunction() { mtx.lock(); // Первый вызов lock() std::cout
Открыть канал и посмотреть медиа🤔 Когда нужно объявлять деструктор виртуальным? Виртуальный деструктор нужен всегда, когда класс предполагается использовать в качестве базового и поддерживает полиморфизм (наследование и динамическое связывание). 🚩Зачем нужен виртуальный деструктор? Если у базового класса деструктор не виртуальный, а удаление происходит через указатель на базовый класс, деструктор производного класса не вызовется! Это приведёт к утечке памяти или некорректному освобождению ресурсов. Пример проблемы без виртуального деструктора #include class Base { public: ~Base() { std::cout
Открыть канал и посмотреть медиа🤔 Что такое deque? Deque (double-ended queue, двусторонняя очередь) — это последовательный контейнер в C++, который позволяет добавлять и удалять элементы как с начала, так и с конца очереди с постоянной временной сложностью O(1). Контейнер deque является частью стандартной библиотеки шаблонов (STL) и объявляется в заголовочном файле . 🚩Основные характеристики: 🟠Быстрый доступ к элементам: deque обеспечивает доступ к элементам по индексу с амортизированной временной сложностью O(1). 🟠Двусторонняя очередь: Позволяет эффективно добавлять и удалять элементы как с начала, так и с конца очереди. 🟠Динамический размер: deque автоматически изменяет свой размер по мере добавления или удаления элементов, подобно vector. 🟠Не требует смежного хранения: В отличие от vector, элементы deque могут быть размещены в различных сегментах памяти, что делает его более гибким для частых операций вставки и удаления. 🚩Основные операции: 🟠Добавление элементов: push_back(), push_front() 🟠Удаление элементов: pop_back(), pop_front() 🟠Доступ к элементам: operator[], at(), front(), back() 🟠Размер и емкость: size(), empty(), resize() 🟠Итераторы: Поддержка итераторов для прохода по элементам #include #include int main() { std::deque dq; // Добавление элементов в конец dq.push_back(1); dq.push_back(2); dq.push_back(3); // Добавление элементов в начало dq.push_front(0); std::cout
Открыть канал и посмотреть медиа🤔 Что такое наследование? Наследование — это механизм ООП, позволяющий одному классу (наследнику) унаследовать свойства и методы другого класса (родителя) для повторного использования и расширения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу знаний
Открыть канал и посмотреть медиаSolo los usuarios registrados pueden compartir su opinión.
¡Sé el primero en compartir tu experiencia con este recurso!
Consejos para el freelance, optimización de trabajo para programadores.
Canal con trucos y hacks seguros para PUBGMobile (GL), KR, VN, TW, BGMI). Versiones premium gratuitas de mods y herramientas para juegos.
BinanceRed Packet: cajas de cripto, GiveawayY distribuciones gratuitas de criptas.