Теория
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)
Лайвкодинг
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# и готов ли перейти на него. Все интервьюеры и сотрудники оставили приятное впечатление.