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

channel icon
Разбираем вопросы с собеседований на С/С++ разработчика.

Сайт: easyoffer.ru

Условия размещения

Цена за 48 часов в ленте 4100,00
Цена за 1 час закрепления N/A
Взаимопиар Нет
Дополнительные условия рекламы Отсутствуют
-4
4 226
подписчиков
-3
907
охват 1 публикации
0
~5
постов / день
0,0%
21,5%
ERR % ?

Статистика

Последние публикации

C/C++ | Вопросы собесов
1 декабря 2024 г. 19:10
🤔 Как работает счетчик у shared_ptr?

shared_ptr использует счётчик ссылок, увеличивающийся при копировании и уменьшающийся при удалении, удаляя ресурс, когда счётчик достигает нуля.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
1 декабря 2024 г. 14:43
Оптимизация налогов! Законно! С гарантией 3 года!Оптимизация налогов! Законно! С гарантией 3 года!

⚡Оптимизируем до 20 млн рублей бесплатно новым клиентам! За текущий или предыдущие кварталы!
Стоимость от 0,9%!💰

🗒Оставьте заявку и мы бесплатно окажем вам подробную консультацию!

👍Жмите кнопку "Подать заявку" и узнайте подробности персонально для вашего бизнеса!

Подать заявкуПодать заявку

#реклама
О рекламодателе
C/C++ | Вопросы собесов
1 декабря 2024 г. 12:10
🤔 Как проверять что все работает в compile-time?Как проверять что все работает в compile-time?

Можно проверять корректность выполнения операций на этапе компиляции, используя различные подходы, такие как статические утверждения (assertions) с помощью ключевого слова static_assert, использование constexpr, а также метапрограммирование на основе шаблонов.

🚩Основные методы проверки

1⃣1⃣Использование `static_assert`
Ключевое слово static_assert позволяет проверять условия во время компиляции и генерировать ошибки, если эти условия не выполняются. Это полезно для выполнения проверок, которые должны быть гарантированы до выполнения программы.

2⃣Функции и переменные `constexpr`
Использование функций и переменных с ключевым словом constexpr позволяет компилятору вычислять их значения на этапе компиляции. Если функция или выражение не могут быть вычислены во время компиляции, это приведет к ошибке компиляции.

3⃣Метапрограммирование на основе шаблонов
Шаблоны и частичные специализации могут быть использованы для выполнения вычислений и проверок на этапе компиляции.

🚩Примеры использования

static_assert
#include 

// Пример с static_assert
constexpr int square(int x) {
return x * x;
}

int main() {
constexpr int value = square(5);
static_assert(value == 25, "Value must be 25"); // Проверка на этапе компиляции

// Пример с проверкой типа
static_assert(std::is_integral::value, "int must be integral type");

return 0;
}


Проверка constexpr функций
#include 

constexpr int factorial(int n) {
return (n <= 1) ? 1 : (n * factorial(n - 1));
}

int main() {
constexpr int result = factorial(5); // Если ошибка, компилятор сообщит об этом

static_assert(result == 120, "Factorial of 5 must be 120"); // Проверка значения

std::cout << "Factorial of 5 is " << result << std::endl;

return 0;
}


Метапрограммирование на основе шаблонов
#include 

// Пример метапрограммирования
template
struct Factorial {
static const int value = N * Factorial::value;
};

template<>
struct Factorial<0> {
static const int value = 1;
};

int main() {
constexpr int result = Factorial<5>::value;
static_assert(result == 120, "Factorial of 5 must be 120");

std::cout << "Factorial of 5 is " << result << std::endl;

return 0;
}


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
30 ноября 2024 г. 19:10
🤔🤔 Какая будет сложность удаления элемента с начала в vector?

Сложность удаления элемента с начала в vector — O(n), так как требуется сдвиг оставшихся элементов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
30 ноября 2024 г. 16:13
Банковская гарантия за 1 час. Без визита в банк.Банковская гарантия за 1 час. Без визита в банк.

Выпуск банковской гарантии в день подачи документов. Без очередей. Решение за 1 час👍

Без расчетного счета. Без залога и поручительств. Все виды гарантий. 44/223-ФЗ и др.✅


Подать заявкуПодать заявку

Финансовые услуги оказывает: Совкомбанк.

#реклама
sovcombank.ru

О рекламодателе
C/C++ | Вопросы собесов
30 ноября 2024 г. 12:10
🤔 Как вычислять значения на этапе компиляции?Как вычислять значения на этапе компиляции?

Вычисление значений на этапе компиляции (compile-time) можно осуществлять с помощью функции constexpr. Функции, объявленные как constexpr, позволяют компилятору вычислять их значения во время компиляции, если аргументы, переданные этим функциям, также являются константными выражениями. Это помогает оптимизировать код и избежать избыточных вычислений во время выполнения программы.

🚩Аспекты

🟠Определение функции
Функция, объявленная с ключевым словом constexpr, может быть вычислена на этапе компиляции, если ей переданы константные выражения. Такая функция должна быть определена в том же заголовочном файле, где она объявлена.

🟠Ограничения функций
Функция должна возвращать значение, которое может быть вычислено на этапе компиляции. Тело функции должно состоять из одной инструкции return или блока, который может быть вычислен как константное выражение. Внутри функции можно использовать только другие constexpr функции или константы.

🟠Использование для переменных
Ключевое слово constexpr также может быть использовано для объявления константных переменных, которые должны быть вычислены на этапе компиляции.

#include 

// Определение constexpr функции
constexpr int factorial(int n) {
return (n <= 1) ? 1 : (n * factorial(n - 1));
}

int main() {
// Вычисление значения на этапе компиляции
constexpr int result = factorial(5);

std::cout << "Factorial of 5 is " << result << std::endl; // Вывод: Factorial of 5 is 120

// Пример использования constexpr переменной
constexpr int size = 10;
int arr[size] = {0}; // Массив с размером, вычисленным на этапе компиляции

for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;

return 0;
}


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
29 ноября 2024 г. 19:10
🤔🤔 Чисто виртуальный метод зачем он нужен и какой синтаксис?

Чисто виртуальный метод задаёт интерфейс для реализации в производных классах, синтаксис: virtual void method() = 0;.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
29 ноября 2024 г. 13:42
Что будет с отечественным рынком квантовых вычислений?Что будет с отечественным рынком квантовых вычислений?

Исследование Рексфот Консалтинг: рынок квантовых вычислений в России

ПодписатьсяПодписаться

#реклама
О рекламодателе
C/C++ | Вопросы собесов
29 ноября 2024 г. 12:10
🤔 Почему vector будет плохо работать если унаследоваться от него?Почему vector будет плохо работать если унаследоваться от него?

🟠Не предусмотрено для наследования
Стандартные контейнеры не разрабатывались с учетом их использования в качестве базовых классов. Они не содержат виртуальных деструкторов, что означает, что при удалении объекта через указатель на базовый класс (в данном случае std::vector) деструкторы производного класса не будут вызываться корректно. Это может привести к утечкам памяти и другим нежелательным последствиям.

🟠Закрытые и защищенные члены
std::vector и другие контейнеры стандартной библиотеки имеют приватные и защищенные члены, к которым вы не сможете получить доступ напрямую из производного класса. Это ограничивает возможность корректного и безопасного расширения функциональности контейнера.

🟠Нарушение инкапсуляции
Наследование предполагает "является отношение" (is-a relationship), но производный класс от std::vector не обязательно является специальным типом вектора, что нарушает принцип Liskov Substitution. Лучше использовать композицию, а не наследование: создать класс, который содержит std::vector как член и предоставляет дополнительные методы.

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

class MyVector : public std::vector {
public:
void push_front(int value) {
this->insert(this->begin(), value); // Попытка добавить элемент в начало
}
};

int main() {
MyVector mv;
mv.push_back(1);
mv.push_back(2);
mv.push_front(0); // Вставка элемента в начало

for (const auto& elem : mv) {
std::cout << elem << " ";
}
return 0;
}


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
28 ноября 2024 г. 19:10
🤔🤔 Какое присваивание разрешает unique_ptr?

unique_ptr поддерживает только перемещение, а не копирование, для обеспечения уникального владения ресурсом.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
28 ноября 2024 г. 14:42
Как мы делаем СУБД Pangolin?Как мы делаем СУБД Pangolin?

Привет! На связи команда разработки СУБД Platform V Pangolin.

Мы делаем полезное сообщество для всех профессионалов из мира СУБД и всех, кому интересен наш продукт.
Пишем о том, как делаем Pangolin, разбираем ваши кейсы в чате, помогаем решать рабочие задачки, зовем на бесплатные вебинары и митапы, проводим квизы про базы данных, разбираем английский сленг, а еще у нас есть вакансии и идеи для хобби айтишников...

Подпишитесь, у нас как раз много нового!

ПодписатьсяПодписаться

#реклама 16+
О рекламодателе
C/C++ | Вопросы собесов
28 ноября 2024 г. 12:10
🤔 Как можно взвести бит используя побитовую операцию ИЛИ (|)?Как можно взвести бит используя побитовую операцию ИЛИ (|)?

Чтобы взвести (установить) бит в определённое значение (1) в числе, можно использовать побитовую операцию ИЛИ (|). Эта операция позволяет установить конкретный бит в 1, не изменяя остальные биты числа.

🚩Как это работает

Операция ИЛИ (|) сравнивает каждый бит двух чисел. Если хотя бы один из битов в соответствующей позиции равен 1, результат в этой позиции будет 1. Иначе, результат будет 0.

🚩Шаги

1⃣Создаём маску, которая имеет единицу в позиции n и нули в остальных позициях. Это можно сделать с помощью выражения 1 << n.
2⃣Применяем операцию ИЛИ между числом x и маской.

#include 

int main() {
int x = 0b00001010; // Число, с которым работаем (10 в десятичной системе)
int n = 3; // Позиция бита, которую хотим установить (начиная с 0)

// Создаём маску с единицей в позиции n
int mask = 1 << n;

// Устанавливаем бит в позиции n
x = x | mask;

// Вывод результата
std::cout << "Результат: " << std::bitset<8>(x) << std::endl; // Двоичный вывод
std::cout << "Результат: " << x << std::endl; // Десятичный вывод

return 0;
}


1 << n создает маску, сдвигая 1 влево на n позиций. Например, если n = 3, результат будет 0b00001000. Операция x | mask устанавливает бит в x на позиции n в 1. Если бит в x на позиции n уже был 1, он останется 1, если он был 0, то станет 1.

🚩Пример вывода

Если x было 0b00001010 и n = 3, результат будет:
Маска: 0b00001000
x | mask: 0b00001010 | 0b00001000 = 0b00001010
В результате бит в позиции 3 установлен в 1, и итоговое значение числа в двоичном формате 0b00001010 (десятичное 10).

Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
27 ноября 2024 г. 19:10
🤔🤔 Асимптотическая сложность вставки и удаления в list и vector?

Для list: вставка и удаление — O(1). Для vector: вставка/удаление в конце — O(1), в середине — O(n).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
27 ноября 2024 г. 18:43
Разработка и изготовление промышленной мебели под проектРазработка и изготовление промышленной мебели под проект

Профессиональная диспетчерская мебель для работы ведущего персонала

Проектирование, изготовление, монтаж

✅Сопровождение проекта
✅Дизайн в соответствии с фирменным стилем
✅Адаптивность конструкции и широкий функционал
✅Персонализированно под задачу

⚡Доставка точно в срок!


Узнать большеУзнать больше

#реклама
consergo.ru

О рекламодателе
C/C++ | Вопросы собесов
27 ноября 2024 г. 12:10
🤔 Что будет, если у нас нет подставленного типа, что не будет знать компилятор?Что будет, если у нас нет подставленного типа, что не будет знать компилятор?

🟠Проблема с компиляцией
Если компилятор не может подставить тип для шаблона, это приведёт к ошибке компиляции. Если раскомментировать последнюю строку, то компилятор выдаст ошибку, потому что оператор + не определён для строковых литералов (в этом случае тип T будет const char*).
template 
T add(T a, T b) {
return a + b;
}

int main() {
std::cout << add(1, 2) << std::endl; // Работает, T = int
std::cout << add(1.5, 2.5) << std::endl; // Работает, T = double
// std::cout << add("1", "2") << std::endl; // Ошибка: компилятор не знает, как сложить строки
return 0;
}


🟠Проблема с определением типов
Иногда проблема может возникнуть, если компилятор не может вывести тип из контекста вызова шаблона. Вызов print() без аргументов приведёт к ошибке компиляции, так как компилятор не может определить тип T.
template 
void print(T value) {
std::cout << value << std::endl;
}

int main() {
print(10); // Работает, T = int
print(3.14); // Работает, T = double
// print(); // Ошибка: компилятор не может вывести тип T
return 0;
}


🟠Специализация шаблонов
Если требуется явная специализация шаблона для определённого типа, но эта специализация не предоставлена, это также может привести к ошибке. Если у нас есть специализация для определённого типа, но она не определена в коде, компилятор не сможет её использовать и выдаст ошибку.
template 
void process(T value) {
std::cout << "Generic process: " << value << std::endl;
}

// Явная специализация для int
template <>
void process(int value) {
std::cout << "Specialized process for int: " << value << std::endl;
}

int main() {
process(10); // Использует специализированную версию для int
process(3.14); // Использует общую версию
process("text"); // Использует общую версию
return 0;
}


🟠Проблемы с зависимыми типами
В шаблонах, использующих зависимые типы, может возникнуть ситуация, когда компилятор не может правильно интерпретировать тип.
template 
class Container {
public:
typename T::value_type getValue() {
// Здесь T::value_type должен быть известен
}
};

class MyType {
public:
using value_type = int;
};

int main() {
Container c;
// Если MyType не содержит value_type, компиляция не удастся
return 0;
}


Ставь 👍 и забирай 📚 📚 Базу знанийБазу знаний
C/C++ | Вопросы собесов
26 ноября 2024 г. 19:10
🤔🤔 Какая сложность работы с кучей?

Операции вставки, удаления и извлечения минимального/максимального элемента имеют сложность O(log n).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу знанийБазу знаний
C/C++ | Вопросы собесов
26 ноября 2024 г. 18:43
Помощь в трудоустройстве в IT-сфере!Помощь в трудоустройстве в IT-сфере!

В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специалистов. Теперь любой желающий может попробовать себя в IT с полного нуля и начать обучение бесплатно!

Узнайте про дальнейшее трудоустройство в ведущие IT-компании для восполнения кадрового дефицита.

Для этого нужно:

- Перейти по ссылке
- Заполнить анкету и ответить на вопросы (занимает менее 3 минут)
- На основании ваших ответов вы сразу узнаете, подходит ли вам сфера IT и сможете ли вы в ней работать

Перейти на сайтПерейти на сайт

#реклама 16+
urban-university.ru

О рекламодателе
C/C++ | Вопросы собесов
26 ноября 2024 г. 18:43
C/C++ | Вопросы собесов
26 ноября 2024 г. 18:43
C/C++ | Вопросы собесов
26 ноября 2024 г. 18:43