Mindbox · ноябрь 2025

Тех собес на middle-senior C/C++ Разработчик в Mindbox

middle-senior Тех собес 18 вопросов 3 задачи
1

Теория

1. Какие курсы или книги по C++ вы проходили и как его изучали?

2. Что вам нравится и не нравится в C++ по сравнению с другими языками, чего в нем не хватает?

3. Что нового появилось в стандартах C++17, C++20 и C++23? Что вас заинтересовало больше всего?

Вопрос

4. Как в C++ реализована поддержка сериализации из коробки?

Ответ

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

6. Что такое SFINAE и PIMPL?

7. Что такое fPIC и для чего он нужен?

8. В чем разница между статической и динамической библиотекой, а также между исполняемым файлом и динамической библиотекой?

9. Каковы способы решения проблемы DLL Hell?

10. Что такое internal linkage?

11. Что такое inline и для чего он нужен?

12. Как прорабатывается константность переменных?

13. Расскажите про битовые поля

14. Если в двух файлах есть функции с одинаковым именем и параметрами, на каком этапе возникнет ошибка?

15. Какова разница между приведением типов в стиле C и в стиле C++?

16. Расскажите про Aggregate initialization и uniform initialization

17. Расскажите про умные указатели

18. Расскажите про алгоритмы поиска в ширину и в глубину (BFS и DFS)

2

Лайвкодинг

19. Задача: Написать сортировку пузырьком

#include <iostream>
#include <vector>

template<typename Collection, typename Comparator, typename = typename Collection::size_type>
void bubble_sorting(Collection &collection, Comparator comparator) noexcept {
    for (typename Collection::size_type i = 0; i < collection.size(); i++) {
        for (typename Collection::size_type j = 0; j < collection.size() - 1; j++) {
            if (comparator(collection[j], collection[j + 1])) {
                std::swap(collection[j], collection[j + 1]);
            }
        }
    }

}

int main() {
    std::vector<int> vec = {1, 2, 5, 3, 4, 6, 8, 6, 5, 3, 3, 2, 5, 7,};
    bubble_sorting(vec, [](auto a, auto b) {
        return a < b;
    });

    for (auto &i: vec) {
        std::cout << i << " ";
    }
}

Комментарий кандидата. Решение приняли, но сказали, что можно было написать лучше.

20. Задача: Написать сортировку Шелла

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T, typename Predicate, typename = typename T::iterator>
void Shell_sorting(T &collection, Predicate comparator) noexcept {
    for (typename T::size_type step = collection.size() / 2; step > 0; step /= 2)
        for (typename T::size_type i = 0; i < collection.size(); i++)
            for (typename T::size_type j = i; (j > step - 1) && comparator(collection[j], collection[j - step]); j--)
                std::swap(collection[j], collection[j - step]);
}

int main() {
    std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 0, 6, 5, 4, 3, 2, 73, 41};
    Shell_sorting(vec, [](auto a, auto b) { return a > b; });
    auto print = [](auto i) { std::cout << i << ","; };
    std::for_each(vec.begin(), vec.end(), print);
}

21. Задача: На многопоточку. Реализуйте паттерн Producer-Consumer

#include <atomic>
#include <thread>
#include <string>
#include <cstdint>
#include <iostream>
#include <queue>
#include <random>
#include <chrono>
#include <ctime>
#include <condition_variable>
#include <mutex>

std::mutex m;
std::condition_variable conditionVariable;

std::queue<int> buffer;

void produce() {
    while (true) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::unique_lock<std::mutex> lock(m);
        conditionVariable.wait(lock, [&] { return buffer.size() < 2; });
        int generatedValue = 1 + rand() % 50;
        std::cout << "Was  produced: " << generatedValue << std::endl;
        buffer.push(generatedValue);
        conditionVariable.notify_one();
    }
}

void consume() {
    while (true) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::unique_lock<std::mutex> lock(m);
        conditionVariable.wait(lock, [&] { return !buffer.empty(); });
        std::cout << "Was consumed: " << buffer.front() << std::endl;
        buffer.pop();
        conditionVariable.notify_one();
    }
}

int main() {
    std::thread t1(consume);
    std::thread t2(produce);
    t1.join();
    t2.join();
}

Дополнительно

Спросили, насколько кандидат знаком с C# и готов ли перейти на него. Все интервьюеры и сотрудники оставили приятное впечатление.