Библиотека собеса по 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
加入频道
Как защитить объект от копирования?

Сделать private конструктор копирования и оператор =.
Что делает алгоритм replace_if?

Алгоритм replace_if() используется для присвоения нового значения всем элементам в диапазоне [first, last), для которых функция IsOdd возвращает true.
Задача

Напишите функцию, которая принимает вектор и удаляет из него нули, а ненулевые элементы оставляет в прежнем порядке. В реализации нельзя использовать циклы.
Задача: Встречалось ли число раньше

Во входной строке записана последовательность чисел через пробел. Для каждого числа выведите слово YES (в отдельной строке), если это число ранее встречалось в последовательности или NO, если не встречалось.
Что делает алгоритм iter_swap?

std::swap используется для обмена элементами между двумя контейнерами. Один из других способов сделать то же самое облегчает std::iter_swap, который, как следует из названия, используется для замены элементов с помощью итератора.

Он просто меняет значения элементов, на которые указывают итераторы. Если мы посмотрим на его внутреннюю работу, мы обнаружим, что эта функция сама использует std::swap().
Есть ли разница между классом и структурой?

Единственное различие между классом и структурой — это модификаторы доступа. Элементы структуры являются общедоступными по умолчанию, а класса — private. Рекомендуется использовать классы, когда вам нужен объект с методами, а в случае с простым объектом — структуры.
Как можно оптимизировать данный цикл?

В исходном цикле каждый раз происходит вычисление позиции элемента в массиве array. Переписав функцию мы избавляемся от этого вычисления.
В чем проблема следующего фрагмента?

Из спецификации (C++11 §5.3.5/3):
Если статический тип подлежащего удалению объекта отличается от его динамического типа, статический тип должен быть базовым классом динамического типа подлежащего удалению объекта и иметь виртуальный деструктор или поведение undefined.
Напишите код для переворота строки

Код переворота строки для контейнеров, без временных переменных, не осуществляющий прохода по всей строке.
В чем отличие vector от deque?

Ответ: Здесь вспоминают о наличии у deque методов push_front и pop_front. Но основное отличие в организации памяти, у vector она как у обычного Си-массива, т.е. последовательный и непрерывный набор байт, а у deque это фрагменты с разрывами. За счет этого отличия vector всегда можно привести к обычному массиву или скопировать целиком участок памяти, но зато у deque операции вставки/удаления в начало быстрее (O(1) против O(n)), ввиду того, что не нужно перемещать.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

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

— Семафор может принимать любое неотрицательное целое значение, мьютекс — только 0 или 1.

— Семафор используется для синхронизации потоков и ограничения доступа к общим ресурсам. Мьютекс — только для взаимного исключения потоков.

— Операции с семафором: wait/signal. С мьютексом: lock/unlock.

— Ожидание семафора можно прервать. Блокировка мьютекса — непрерывная.

— Семафоры можно использовать для реализации ограниченных ресурсов, счетчиков, барьеров. Мьютексы — только для взаимного исключения.

— Мьютекс может быть рекурсивным, семафор — нет.

— Использование семафора часто требует больше кода и аккуратности чем мьютекса.
Что такое глубокое копирование?

Глубокое копирование (deep copy) — это создание полной копии объекта, включая все его внутренние объекты и поля.
В Java глубокое копирование нужно реализовывать вручную, так как оператор присваивания и конструктор копирования создают поверхностную копию (shallow copy).

При поверхностном копировании копируются только поля текущего объекта. Внутренние объекты не копируются, а их ссылки просто переносятся в новый объект.
При глубоком копировании рекурсивно копируются также все вложенные объекты. Это позволяет разорвать связь между исходным объектом и копией.

Для глубокого копирования в Java используют:
— Переопределение метода clone().
— Сериализацию объекта.
— Вручную рекурсивно копировать все поля и вложенные объекты.

Глубокое копирование нужно, чтобы изменения в копии объекта не влияли на оригинал. Это важно для правильной работы программы.
Может ли inline-функция быть рекурсивной?

Поскольку компилятор просто встраивает код inline-функции в место вызова, не имеет значения, является ли эта функция рекурсивной или нет. Компилятор будет просто копировать один и тот же код функции при каждом рекурсивном вызове.

Таким образом, рекурсивные inline-функции абсолютно допустимы и часто используются, когда нужна рекурсия без накладных расходов на стандартные вызовы функций.
В чем разница между struct и class?

Ответ: Практически ни в чем. В struct модификаторы доступа по умолчанию public, в class private. Также отличается и наследование по умолчанию, у struct — public, у class — private.
Как перебирать слова строки?

Другие способы можно найти здесь.
Что такое vptr?

vptr означает «virtual pointer» (виртуальный указатель) и является частью механизма виртуальных функций и полиморфизма.

Когда класс содержит хотя бы одну виртуальную функцию, компилятор добавляет в этот класс скрытый указатель, который называется vptr. Этот указатель указывает на таблицу виртуальных функций, которая называется «таблицей виртуальных функций» или «vtable». В этой таблице содержатся указатели на реализации виртуальных функций для данного класса и всех его производных классов.
В чем отличие malloc от new?

malloc — выделение блока памяти в стиле Си, опасное с точки зрения приведения типов (non-typesafe), т.к. возвращает void* и требует обязательного приведения.

new — выделение блока памяти и последующий вызов конструктора, безопасное с точки зрения приведения типов (typesafe), т.к. тип возвращаемого значения определен заранее.
Что такое деструктор?

Деструктор — это экземпляр функции-члена, который вызывается автоматически, если какой-либо объект собирается быть уничтоженным. Используется в основном для освобождения памяти.

Деструкторы не принимают аргументов и не возвращают типы, и их адрес не может быть получен.

Они могут быть объявлены как виртуальные или чисто виртуальные, но не как константные, изменчивые, константные изменчивые или статические.
Какая разница между модульными и интеграционными тестами?

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

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