Библиотека собеса по C++ | вопросы с собеседований
4.71K subscribers
384 photos
2 videos
163 links
Вопросы с собеседований по C++ и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/9ccf302b

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
😏 Чем отличается агрегация и композиция?

Агрегация и композиция - это два понятия из ООП, которые выполняют функцию похожую на наследование, но другим способом

👉 Видео с ответом
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

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

Под паттернами проектирования часто имеют ввиду GoF паттерны, которые предназначены для удобного и эффективного описания структуры кода


Порождающие паттерны:

• Singleton
• Factory Method
• Abstract Factory
• Builder
• Prototype

Структурные паттерны:
• Adapter
• Bridge
• Composite
• Decorator
• Facade
• Flyweight
• Proxy

Поведенческие паттерны:
• Chain of Responsibility
• Command
• Interpreter
• Iterator
• Mediator
• Memento
• Observer
• State
• Strategy
• Template Method
• Visitor
🫐 Что такое PIMPL?

PIMPL (Pointer to IMPLementation) - это техника, которая скрывает детали реализации класса за указателем на вспомогательный класс, содержащий фактическую реализацию

❗️Основная идея
В публичном заголовочном файле объявляется только интерфейс класса и указатель на вспомогательный класс. Все детали реализации перемещаются в отдельный файл реализации.

❗️Структура

Публичный класс (в заголовочном файле):
class PublicClass {
public:
PublicClass();
~PublicClass();
void someMethod();
private:
class Impl;
std::unique_ptr<Impl> pimpl;
};


Приватный класс (в файле реализации):
class PublicClass::Impl {
public:
void someMethod() {
// Реальная реализация
}
};
🥪 Какие преимущества и недостатки PIMPL?


❗️Преимущества

- Улучшение времени компиляции: изменения в реализации не требуют перекомпиляции кода, использующего публичный класс
- Сокрытие деталей реализации: пользователи класса видят только его интерфейс
- Упрощение ABI (Application Binary Interface): изменения в приватной части не влияют на ABI
- Уменьшение зависимостей: заголовочный файл не нуждается в инклюдах для внутренних типов.


❗️Недостатки

- Дополнительный уровень косвенности: может слегка снизить производительность
- Усложнение кода: требует написания дополнительного кода для управления указателем
- Увеличение размера объекта: из-за хранения указателя


❗️Альтернатива

- C++20 появился концепт модулей, который может частично заменить PIMPL, предоставляя лучшие механизмы для сокрытия реализации и управления зависимостями
👾 -35% на хардкорный курс по вышмату

На курсе вы получите все необходимые знания для старта карьеры в DS или аналитике – https://proglib.io/w/6a7a6f96

19 490 рублей 29 990 рублей

Что еще вас ждет на курсе:

▪️ Полугодовая программа от преподавателей ВМК МГУ;

▪️ 150 практических заданий и 47 видеолекций;

▪️ Бессрочный доступ ко всем материалам курса;

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

🌚 Переходите на сайт, читайте подробности и заходите на обучение по самым выгодным условиям – https://proglib.io/w/6a7a6f96
Please open Telegram to view this post
VIEW IN TELEGRAM
🍯 Задача с собеседования

Входные данные:
- Дан массив состоящий из int'ов
- Повторяющихся элементов в списке нет

Задача:
- Нужно преобразовать этот массив в строку, сворачивая соседние по числовому ряду числа в диапазоны

Примеры:
[1,4,5,2,3,9,8,11,0] => "0-5,8-9,11"
[1,4,3,2] => "1-4"
[1,4] => "1,4"

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>

std::string convertToRanges(std::vector<int>& nums) {
if (nums.empty()) {
return "";
}

// Сортируем вектор
std::sort(nums.begin(), nums.end());

std::vector<std::string> ranges;
int start = nums[0];
int prev = start;

for (size_t i = 1; i < nums.size(); ++i) {
if (nums[i] != prev + 1) {
// Если последовательность прервалась, добавляем диапазон
if (start == prev) {
ranges.push_back(std::to_string(start));
}
else {
ranges.push_back(std::to_string(start) + "-" + std::to_string(prev));
}
start = nums[i];
}
prev = nums[i];
}

// Добавляем последний диапазон
if (start == prev) {
ranges.push_back(std::to_string(start));
}
else {
ranges.push_back(std::to_string(start) + "-" + std::to_string(prev));
}

// Объединяем диапазоны в одну строку
std::ostringstream result;
for (size_t i = 0; i < ranges.size(); ++i) {
if (i > 0) {
result << ",";
}
result << ranges[i];
}

return result.str();
}

int main() {
std::vector<int> nums1 = { 1, 4, 5, 2, 3, 9, 8, 11, 0 };
std::cout << convertToRanges(nums1) << std::endl; // Ожидаемый вывод: "0-5,8-9,11"

std::vector<int> nums2 = { 1, 4, 3, 2 };
std::cout << convertToRanges(nums2) << std::endl; // Ожидаемый вывод: "1-4"

std::vector<int> nums3 = { 1, 4 };
std::cout << convertToRanges(nums3) << std::endl; // Ожидаемый вывод: "1,4"

return 0;
}
📖 От Кнута до Седжвика: классика алгоритмической литературы

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

🔗 Читать подборку
😜 Шпаргалка по библиотеке fmt

Небольшая, но очень полезная шпаргалка, рассказывающая о возможных способах форматирования различных типов данных с помощью стандартной библиотеки fmt.

👉 Источник
Какой контейнеров гарантирует отсутствие дубликатов?
Anonymous Quiz
3%
std::vector
86%
std::set
5%
std::deque
5%
std::forward_list