😱 Какие знаете паттерны проектирования?
Под паттернами проектирования часто имеют ввиду 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 
❤7
  🫐 Что такое PIMPL?
PIMPL (Pointer to IMPLementation) - это техника, которая скрывает детали реализации класса за указателем на вспомогательный класс, содержащий фактическую реализацию
❗️Основная идея
В публичном заголовочном файле объявляется только интерфейс класса и указатель на вспомогательный класс. Все детали реализации перемещаются в отдельный файл реализации.
❗️Структура
Публичный класс (в заголовочном файле):
Приватный класс (в файле реализации):
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() {
        // Реальная реализация
    }
};❤5
  🥪 Какие преимущества и недостатки PIMPL?
❗️Преимущества
- Улучшение времени компиляции: изменения в реализации не требуют перекомпиляции кода, использующего публичный класс
- Сокрытие деталей реализации: пользователи класса видят только его интерфейс
- Упрощение ABI (Application Binary Interface): изменения в приватной части не влияют на ABI
- Уменьшение зависимостей: заголовочный файл не нуждается в инклюдах для внутренних типов.
❗️Недостатки
- Дополнительный уровень косвенности: может слегка снизить производительность
- Усложнение кода: требует написания дополнительного кода для управления указателем
- Увеличение размера объекта: из-за хранения указателя
❗️Альтернатива
- C++20 появился концепт модулей, который может частично заменить PIMPL, предоставляя лучшие механизмы для сокрытия реализации и управления зависимостями
❗️Преимущества
- Улучшение времени компиляции: изменения в реализации не требуют перекомпиляции кода, использующего публичный класс
- Сокрытие деталей реализации: пользователи класса видят только его интерфейс
- Упрощение ABI (Application Binary Interface): изменения в приватной части не влияют на ABI
- Уменьшение зависимостей: заголовочный файл не нуждается в инклюдах для внутренних типов.
❗️Недостатки
- Дополнительный уровень косвенности: может слегка снизить производительность
- Усложнение кода: требует написания дополнительного кода для управления указателем
- Увеличение размера объекта: из-за хранения указателя
❗️Альтернатива
- C++20 появился концепт модулей, который может частично заменить PIMPL, предоставляя лучшие механизмы для сокрытия реализации и управления зависимостями
👍10
  Что выведет код?
  Anonymous Quiz
    11%
    hello
      
    1%
    world
      
    45%
    hello world
      
    12%
    hello world hello world
      
    31%
    hello worldhello world
      
    👾 -35% на хардкорный курс по вышмату
На курсе вы получите все необходимые знания для старта карьеры в DS или аналитике – https://proglib.io/w/6a7a6f96
19 490 рублей29 990 рублей 
Что еще вас ждет на курсе:
▪️ Полугодовая программа от преподавателей ВМК МГУ;
▪️ 150 практических заданий и 47 видеолекций;
▪️ Бессрочный доступ ко всем материалам курса;
▪️ Развернутая обратная связь по всем домашним заданиям, а также ссылки на полезные дополнительные материалы.
🌚  Переходите на сайт, читайте подробности и заходите на обучение по самым выгодным условиям – https://proglib.io/w/6a7a6f96
На курсе вы получите все необходимые знания для старта карьеры в DS или аналитике – https://proglib.io/w/6a7a6f96
19 490 рублей
Что еще вас ждет на курсе:
▪️ Полугодовая программа от преподавателей ВМК МГУ;
▪️ 150 практических заданий и 47 видеолекций;
▪️ Бессрочный доступ ко всем материалам курса;
▪️ Развернутая обратная связь по всем домашним заданиям, а также ссылки на полезные дополнительные материалы.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  Что будет при попытке компиляции кода?
  Anonymous Quiz
    21%
    Программа соберётся и выведет 00
      
    19%
    Программа соберётся, но будет неопределённое поведение
      
    38%
    Программа не соберётся
      
    23%
    Программа соберётся, и выведутся мусорные значения
      
    🍯 Задача с собеседования
Входные данные:
- Дан массив состоящий из 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"
Входные данные:
- Дан массив состоящий из 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;
}
👍2
  Forwarded from Книги для программистов
📖 От Кнута до Седжвика: классика алгоритмической литературы
Обзор лучших книг по алгоритмам для программистов всех уровней. От иллюстрированных пособий для начинающих до фундаментальных трудов для экспертов.
🔗 Читать подборку
Обзор лучших книг по алгоритмам для программистов всех уровней. От иллюстрированных пособий для начинающих до фундаментальных трудов для экспертов.
🔗 Читать подборку
😜 Шпаргалка по библиотеке fmt
Небольшая, но очень полезная шпаргалка, рассказывающая о возможных способах форматирования различных типов данных с помощью стандартной библиотеки fmt.
👉 Источник
Небольшая, но очень полезная шпаргалка, рассказывающая о возможных способах форматирования различных типов данных с помощью стандартной библиотеки fmt.
👉 Источник
👍10❤1🥰1
  Какой контейнеров гарантирует отсутствие дубликатов?
  Anonymous Quiz
    3%
    std::vector
      
    86%
    std::set
      
    5%
    std::deque
      
    5%
    std::forward_list
      
    🤔4
  🍣 Что такое битовые поля?
Битовые поля в C++ — это способ экономии памяти, позволяющий задавать члены класса с точным размером в битах. Например, в структуре можно выделить под день недели всего 3 бита, а под день месяца — 6.
❗️Битовые поля могут усложнять код и отладку, а также имеют ограничения (например, нельзя получить адрес битового поля).
  Битовые поля в C++ — это способ экономии памяти, позволяющий задавать члены класса с точным размером в битах. Например, в структуре можно выделить под день недели всего 3 бита, а под день месяца — 6.
struct Date {
  unsigned short nWeekDay : 3;  // 0..7 (3 бита)
  unsigned short nMonthDay : 6; // 0..31 (6 бит)
  unsigned short nMonth : 5;    // 0..12 (5 бит)
};❗️Битовые поля могут усложнять код и отладку, а также имеют ограничения (например, нельзя получить адрес битового поля).
