Библиотека собеса по 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
加入频道
🍔 В чём разница между std::endl и '\n'?

Единственное существенное различие между std::endl и '\n' в том, что std::endl очищает буфер вывода и результат сразу выводится, а '\n' — это просто символ и сайдэффектов не имеет

Если программа требовательная к ресурсам, то стоит пользоваться '\n' и изредка вызывать std::flush для очистки буфера
🍔 Дополнительный код

Дополнительный код (или two's complement) — это умный способ хранения целых чисел, позволяющий очень легко реализовать распространенные математические задачи. В основном используется потому что легко представлять отрицательные числа

🥝 Основные принципы
- для нуля используем 0
- для положительных целых чисел используем значения от 1 и до 2 в степени (количество битов-1) минус 1
- для отрицательных чисел инвертируем бинарное представление и добавляем единицу — это и есть дополнительный код

🍎 Примеры (бинарное представление = значение)
• 0000 = 0
• 0001 = 1
• 0010 = 2
• 1111 = -1
• 1110 = -2
• 1101 = -3
🌳 Как объявить интерфейс в C ++?

В C++ интерфейсом можно считать класс с чисто виртуальными методами

Чисто виртуальный метод - это метод класса, который определяется как виртуальный и которому присваивается значение 0

class ITest
{
public:
virtual ~ITest() {}
virtual void Method() = 0;
};

class MainTest : public ITest
{
public:
virtual void Method() override
{
}
};
🧨 Как установить, очистить и переключить один бит?

❗️Установка бита

- Используется побитовый оператор OR (|), чтобы установить n-й бит number в 1 значение
- Стоит помнить, что сдвиг больше, чем на ширину типа, является неопределенным поведением

typedef unsigned long ulong;

ulong bit_set(ulong number, ulong n) {
return number | ((ulong)1 << n);
}


❗️Очистка бита

- Используется побитовый оператор AND (&) , чтобы установить n-й бит number в 0 значение
- Вы должны инвертировать битовую строку с помощью побитового оператора NOT (~) , затем оператор &
ulong bit_clear(ulong number, ulong n) {
return number & ~((ulong)1 << n);
}


❗️Переключение бита

- Используйте побитовый оператор XOR (^) для переключения n-го бита number

ulong bit_toggle(ulong number, ulong n) {
return number ^ ((ulong)1 << n);
}


❗️Проверка бита
- Чтобы проверить бит, сдвиньте number вправо на n бит , затем воспользуйтесь &

bool bit_check(ulong number, ulong n) {
return (number >> n)& (ulong)1;
}
Самые полезные каналы для программистов в одной подборке!

Сохраняйте себе, чтобы не потерять 💾

🔥Для всех

Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы

🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion

#️⃣C#

Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel

☁️DevOps

Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования

🐘PHP

Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты

🐍Python

Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты

Java

Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков

👾Data Science

Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту

🦫Go

Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go

🧠C++

Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++

💻Другие каналы

Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности

📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈

Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT

Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *

* Организация Meta запрещена на территории РФ
🌟 Выведение размера массива

Для std::array размер в общем случае задаётся вручную
std::array<int, 2> test{ 2,3 };


Начиная с C++17 можно оставить вывод размера компилятору
std::array test{ 2,3 };


Но если необходимо использовать шаблоны, то можно воспользоваться шаблонной магией
template<typename T, size_t N>
int size(const std::array<T, N>& types)
{
    return N;
}
В каких случаях применяется инициализация нулями?

- Статические переменные (static), глобальные и thread_local
thread_local int a; // thread_local

int b; // global

struct Test {
static int test; // static
};

int Test::test;


- Если мы инициализируем default значениями примитивных типов
void dunc(int t){}

f(int());


- Для явно не инициализированных Си-массивов
char a[5] = "123"; //  a[3] = a[4] = 0
Как получить размер файла в байтах?

В C++17 была добавлена библиотека filesystem, которая упрощает работу с файловой системой

#include <filesystem>

int main()
{
std::uintmax_t size = std::filesystem::file_size("file.txt");
}


❗️Стоит учитывать, что если файл был открыт не только вами, то размер может быть изменён извне
🌳 Разница между кучей и стеком

• Стек непрерывен, но куча не обязательно непрерывна
• Существуют разные способы применения.Стек автоматически выделяется операционной системой, а кучей приходится управлять вручную
• Стек растет от большего адреса к меньшему, куча растет от меньшего адреса к большему
• Временем жизни стека управляет система и в большинстве случаев доступ к нему более быстрый. Куча же может распределяться неравномерно по памяти и подвержена внутренней фрагментации
🔮 В чем разница между статическим выделением памяти и динамическим выделением памяти?

- Статическое выделение памяти выполняется во время компиляции и не потребляет ресурсов ЦП; динамическое выделение памяти выполняется во время выполнения, а для выделения и освобождения требуются ресурсы ЦП
- Динамическое выделение памяти может привести к утечке памяти
- Для выделения статической памяти не требуется поддержка указателей. Для динамического выделения памяти требуется
- Статическое выделение памяти выполняется по плану, и размер блока памяти определяется перед компиляцией. Динамическое выделение памяти выполняется по мере необходимости
- Статическое выделение памяти дает контроль над памятью компилятору. Динамическое выделение памяти дает контроль над памятью программисту
🔮 Что вернёт a[10] == 10 [a]?

Стандарт Си определяет [] как оператор следующим образом:
a[b] == *(a + b)


Следовательно , a[10] будет вычисляться как:
*(a + 10)


а 10[a] будет вычисляться как
*(10 + a)


a - указатель на первый элемент массива. a[10] - это значение, которое на 10 элементов дальше от a, что совпадает с *(a + 10)
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
😱 Как объединить строки в C?

В Си строки - это просто массивы char'ов. Следовательно, мы не можем напрямую объединить их с другими строками

Мы можем использовать strcat функцию, которая добавляет строку, на которую указывает src, в конец строки, на которую указывает dest:

char *strcat(char *dest, const char *src);


❗️dest выполняет роль буфера назначения. Буфер назначения должен быть буфером массива символов. Он должен быть больше суммарного размера двух строк: той которая в нём уже есть и той которая копируется

Пример:
char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");


❗️Возвращаемое значение strcat можно просто игнорировать, оно просто возвращает тот же указатель, который был передан в качестве первого аргумента

strcat(strcat(str, foo), bar);


Из всего выше сказанного объединить две строки можно с помощью
char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
😱 В чем разница между вектором и списком?

std::vector — это реальный массив, а базовая реализация std::list — это двусторонне связанный список

std::vector поддерживает произвольный доступ с доступом за O(1), но производительность вставки и удаления в общем случае низкая. Но стоить отметить что вставка в конец если capacity больше size происходить за O(1)

Так же вставка и удаление из std::vector в узлах, отличных от хвоста, вызовет копирование памяти, в std::list такого не происходит

std::list не поддерживает произвольный доступ, но производительность вставки и удаления O(1)

std::vector хранится последовательно, список — нет

std::vector выделяет память сразу и увеличивает емкость в два раза, когда ее недостаточно. std::list будет обращаться за новой памятью каждый раз, когда вставляется новый узел
🍔 Какая избавиться от вложенных min/max?

Старый вариант использования

auto maxVal = std::max(x1, min(x2, max(x3, x4)));


Сейчас же можно использовать cписки инициализации, чтобы уменьшить вложенность
auto maxVal = std::max({x1, x2, x3, x4});
⚡️Proglib запускает канал про ИИ для генерации звука

Там мы будем рассказывать про все существующие нейросети, которые генерируют музыку и голос — с пошаговыми инструкциями, инструментами и лайфхаками.

⭐️генерация голоса и музыки
⭐️замена и перевод речи
⭐️распознавание звуков

👉Подписывайтесь!
🍔 Отладочные макросы

Отладочные макросы в C++ используются для упрощения процесса отладки и диагностики программного кода

Основные отладочные макросы включают assert, static_assert и пользовательские макросы

🍓 assert

Макрос assert определён в заголовочном файле <cassert> и используется для проверки логических выражений во время выполнения программы. Если выражение вернёт false, assert завершает выполнение программы и выводит сообщение об ошибке
#include <cassert>

void test(int x) {
assert(x > 0 && "x must be positive");
// остальной код функции
}

int main() {
test(5); // проходит проверку
test(-3); // приводит к ошибке во время выполнения
return 0;
}


🍒 static_assert

static_assert введён в C++11 и позволяет проверять условия на этапе компиляции. Это особенно полезно для проверки условий, которые должны выполняться всегда, независимо от состояния программы во время выполнения

#include <type_traits>

template <typename T>
void check() {
static_assert(std::is_integral<T>::value, "T must be an integral type");
}

int main() {
check<int>(); // проходит проверку
check<float>(); // ошибка компиляции: T must be an integral type
return 0;
}


❗️Начиная с C++11 и C23 static_assert является ключевым словом

🫐 Пользовательские отладочные макросы

Вы также можете определять собственные макросы для отладки, которые помогут вам выводить дополнительную информацию или выполнять специфические проверки

#include <iostream>

#define DEBUG

#ifdef DEBUG
#define DEBUG_PRINT(x) std::cout << x << std::endl
#else
#define DEBUG_PRINT(x)
#endif

int main() {
int value = 42;
DEBUG_PRINT("Value: " << value);
return 0;
}
🤯 Как простая задачка поставила в тупик программистов (и как они из него выбрались)

В 2010 году пользователь Stack Overflow не справился с задачей на собеседовании. Обсуждение способов решения этого задания стало одной из самых популярных тем на платформе.

Об этой истории, а также о способах решения задачи, читайте в нашей статье
👉 Ссылка
👉 Зеркало
✉️ Как завалить собеседование, даже не начав его: 8 ошибок в сопроводительных письмах

Откликаетесь, но сразу получаете отказы? Не торопитесь с выводами — возможно, все дело в вашем сопроводительном письме.

👉Сопроводительное — это первое впечатление, которое мы производим на эйчара, а первое впечатление, как известно, очень важно.

Собрали для вас несколько распространенных ошибок по составлению такого письма — а в статье по ссылке можно найти остальные ошибки и пример идеального сопроводительного.

Кстати, вакансии можно поискать в наших профильных каналах:
🤮Data Science, анализ данных, аналитика
🤮Python
🤮Frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM