seniorcpp | Unsorted

Telegram-канал seniorcpp - Senior C++ Developer

13626

Изучаем C++. По вопросам сотрудничества: @adv_and_pr

Subscribe to a channel

Senior C++ Developer

#вопросы_с_собеседований
Что такое глубокое копирование?

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

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

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

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

Читать полностью…

Senior C++ Developer

rvalue

Rvalue — это временный объект, который может быть перемещен или скопирован. Например, результат выражения или возвращаемое значение функции — это rvalue.
Rvalues являются временными объектами, которые разрушаются после использования. Перемещение ресурсов из rvalue более эффективно, чем копирование.

Константные ссылки или ссылки на const (const T&) могут связываться только с lvalues.
Неконстантные ссылки (T&) могут связываться как с lvalues, так и с rvalues.

*Lvalue — объект с именем, например переменная.

#это_база

Читать полностью…

Senior C++ Developer

Работу найти проще, когда вы уверены в своих знаниях и коде. Изучайте актуальные стеки и технологии на курсах для разработчиков от Яндекс Практикума, получайте дополнительные навыки и зарабатывайте больше 🫶🏼

На курсах можно:
– освоить Go и С++ для бэкенда на продвинутом уровне;
– прокачаться от джуна до мидла во фронтенде и бэкенде;
– погрузиться в React;
– научиться тестировать веб-приложения на Java и Python;
– разобраться в алгоритмах и структурах данных для работы и собеседований;
– освоить методологию DevOps для эксплуатации и разработки.

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

Читать полностью…

Senior C++ Developer

std::array

std::arrayэто шаблонный контейнерный тип данных, представляющий собой статический массив с фиксированным размером.
В отличие от обычных C-style массивов, std::array является полноценным объектом со всеми преимуществами ООП.

Основные характеристики:
— Размер массива задается шаблонным параметром и не может изменяться во время выполнения.
— Элементы хранятся в последовательной памяти, что дает хорошую локальность и производительность.
— Поддерживает итераторы, можно использовать в циклах range-for.
— Имеет полезные методы — size(), front(), back(), data() и др.
— Автоматически инициализирует элементы по умолчанию.
— Передается по значению, в отличие от сырых указателей.

Читать полностью…

Senior C++ Developer

Декомпозиция при объявлении (structural bindings)

Structural bindings — это возможность С++17 разложить объект на отдельные переменные прямо в месте объявления.
Позволяет избежать временных объектов при разборе структур, сокращает и упрощает код при работе со структурами.

Structural bindings активно используется в модульном тестировании для проверки структур и классов.
Также применяется для деструктуризации данных в функциональном программировании.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Расскажите о работе с сырыми указателями.

Работа с сырыми указателями (raw pointers) требует внимания к управлению памятью:

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

— Память под указатель выделяется вручную с помощью new и освобождается вручную с delete.

— Опасность утечек памяти при потере последнего указателя на объект.

— Нужно следить за правильностью вызовов new/delete во избежание ошибок.

— Может привести к проблемам при копировании указателей (неявное копирование объекта).

— Предпочтительно использовать умные указатели вроде unique_ptr для безопасности.

— Сырые указатели полезны для низкоуровневых оптимизаций производительности.

— Требуют явного кодирования работы с памятью в стиле Си.

Читать полностью…

Senior C++ Developer

Кто нужен нам сегодня? Герой! А что нужно любому герою? Миссия! 🤩

Приглашаем пройти квест «Миссия Мидори» — игру для C++ разработчиков про умный город, где что-то пошло не так...

Знание C++ поможет вам пройти игру и спасти город от киберугроз. А еще…

«Лаборатория Касперского» ищет крутых С++ разработчиков 🔥

Направления:
Developer C++ (KESL) со знанием C++ и сетевых технологий и протоколов (TCP/IP), а также с опытом разработки многопоточных приложений и использования средств разработки ПО под Linux;
Developer C++ (NGFW) со знанием С++, STL и базовых алгоритмов и структур данных, с навыками разработки многопоточных приложений, умением писать код и структурировать его.

Технические этапы собеседования:
1. общение про С++ и обсуждение аспектов ОС;
2. написание кода, который будет приближен к задачам программистов.

Работа в нашем коллективе — это возможность заниматься мировой кибербезопасностью и окружать себя профессионалами.

Спасите мир от киберугроз, откликайтесь на вакансии и проходите миссии до конца.

Реклама. АО "ЛАБОРАТОРИЯ КАСПЕРСКОГО". ИНН 7713140469. erid: LjN8KPprp

Читать полностью…

Senior C++ Developer

Профессия "Тестировщик программного обеспечения" — отличный источник дохода и быстрый вход в IT-сферу. Освойте эту специальность бесплатно 💯 в дистанционном формате всего за 3 месяца. Выдаем диплом о профессиональной переподготовке, помогаем найти работу.

Приглашаем:
— Женщин в декрете и неработающих мам детей до 7 лет
— Студентов старшего курса и выпускников без работы
— Безработных и лиц под риском увольнения
— Лиц 50 лет и старше
Подробные условия на сайте.

Мы также обучаем по программе:
📊 Профессия "Системный аналитик"

Почему мы?
🏢  Мы — официальный образовательный партнер Института развития профессионального образования
🏅  Преподаватели-практики с высокой экспертизой и многолетним опытом
🙍‍♀️  Поддержка тьютора в зачислении и обучении
🙌  Увлеченное сообщество слушателей
💻  Удобная образовательная платформа для онлайн-обучения

Зарегистрируйтесь и начните учиться уже в сентябре!
https://clck.ru/35YHiC 

Читать полностью…

Senior C++ Developer

🔥Приглашаем на практический открытый урок "Готовим рабочее место: С++ + VSCode"

 Дата: 5 сентября в 20:00 по Москве. Занятие пройдёт в рамках курса «Специализация С++ Developer» от OTUS.

✅На занятии мы:

- с нуля настроим VS Code;
- соберем и отладим небольшой C++ проект;- познакомимся с инструментами из экосистемы C++.

💡Вебинар будет полезен:

- начинающим разработчикам на языке C++;
- C++ разработчикам, которые хотят познакомиться VS Code.

Продолжить изучение С++ можно на онлайн-курсе доступном в рассрочку.

Регистрация на вебинар: https://otus.pw/4DPS/

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: LjN8KPYxL

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое variadic templates?

Variadic templates — это функция шаблонов, которая позволяет определить функцию или класс с переменным количеством аргументов.
Эта возможность появилась в C++11.

Variadic templates позволяют создавать функции, которые могут принимать произвольное количество аргументов, не зная заранее их типов.
Это достигается за счет использования упаковки аргументов (pack expansion) и рекурсивных шаблонов.

Проще говоря, variadic templates расширяют возможности шаблонов и позволяют создавать гибкие и универсальные компоненты.

Читать полностью…

Senior C++ Developer

Ромбовидное наследование

Ромбовидное наследование (diamond inheritance) — это ситуация, когда класс наследуется от нескольких базовых классов, которые в свою очередь наследуются от общего предка.
Например:

class A { };
class B : public A { };
class C : public A { };
class D : public B, public C { };

Здесь класс D наследуется от B и C, которые оба наследуются от класса A. Получается ромбовидная иерархия наследования.

На изображении класс D наследуется от B и C, которые в свою очередь наследуют метод print() от A.
При вызове printAll() метод print() вызывается дважды — по пути наследования через B и через C.

Читать полностью…

Senior C++ Developer

Функция resize

Функция resize служит для изменения размера контейнеров, например вектора или deque.
Она динамически меняет количество элементов в контейнере на указанное число.

Например, для вектора numbers вызов:

numbers.resize(100);

Установит размер вектора в 100 элементов.
Если изначально элементов было меньше — новые будут инициализированы по умолчанию (нулями). Если было больше — лишние удалятся.

Также можно явно задать значение для инициализации:
numbers.resize(80, -1);

Также resize принимает вектор-шаблон для копирования значений при расширении.

#это_база

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Какая разница между std::map и std::unordered_map?

std::map
— это ассоциативный контейнер на основе красно-черного дерева. Элементы хранятся в отсортированном порядке по ключу. Сложность операций O(log N).

std::unordered_map реализован как хеш-таблица. Элементы хранятся в произвольном порядке. В среднем сложность операций O(1).

Основные различия между std::map и std::unordered_map:

— Поиск, вставка и удаление в std::map за O(log N) в худшем случае. В std::unordered_map за O(1) в среднем.
— Итераторы std::map позволяют перебирать элементы в отсортированном порядке. Порядок элементов std::unordered_map произвольный.
— Map поддерживает бинарный поиск lower_bound(), upper_bound(), а unordered_map — нет.
— В unordered_map нельзя использовать указатели в качестве ключей в хеш-таблице. В map можно.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Зачем делать explicit-конструктор?

Explicit-конструктор используется для преобразования типов с явным указанием желаемого типа. Это позволяет избежать неявных преобразований и потенциальных ошибок.

Основные причины использовать explicit-конструктора:

— Предотвратить неявные преобразования, которые могут привести к потере данных.
— Избежать вызова конструктора при копировании объекта.
— Принудительно вызывать конструктор только при явном преобразовании типов.
— Улучшить читаемость кода, делая преобразования типов очевидными.

Читать полностью…

Senior C++ Developer

Функция minmax_element

Функция minmax_element — это алгоритм из стандартной библиотеки algorithm, который позволяет найти минимальный и максимальный элементы в диапазоне.

Функция принимает два итератора, задающих диапазон поиска и возвращает пару итераторов на минимальный и максимальный элементы. Работает для любых типов данных, поддерживающих операцию сравнения <.

Некоторые характеристики:
— Позволяет найти границы диапазона за один проход по последовательности.
— Удобна при необходимости найти пределы в контейнере или массиве.
— Предпочтительнее циклов, т. к. проще в использовании и читабельнее.
— Может применяться со стандартными контейнерами, векторами, списками.

#это_база

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Как работают константные методы?

Константные методы — это методы, которые помечены модификатором final. Это означает, что тело метода не может быть переопределено в подклассах.

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

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

Читать полностью…

Senior C++ Developer

Токенизация строки

Токенизация строки — это процесс разбиения строки на токены (лексемы) — отдельные элементы, например слова, числа, операторы.

Для токенизации нужно:

— Разбить строку на токены при помощи разделителей, например пробелов.
— Классифицировать каждый токен — определить его тип (число, строка, оператор и т. д.)
— Преобразовать токены к нужному типу, например из строки в число.
— Сохранить результаты в подходящей структуре данных.
— Обрабатывать ошибки, например неверный формат числа.

Для разбиения строки на токены в С++ удобно использовать stringstream.
Для хранения результатов часто используют структуры или классы, хранящие тип и значение токена.

Токенизация нужна для разбора входных данных, конфигурационных файлов, математических выражений и т. д.

#это_база

Читать полностью…

Senior C++ Developer

buf указатель

buf — это указатель на буфер (массив байтов), часто использующийся для работы с бинарными данными.
Объявляется как u_char *buf или unsigned char *buf. Хранит данные типа unsigned char. Используется для указания на выделенный буфер памяти, куда будут помещаться данные.

В основном используется совместно с функциями memcpy, memset и др. для копирования данных.

Часто применяется в сетевом программировании, криптографии.

Читать полностью…

Senior C++ Developer

❤️Разработка — любовь всей вашей жизни? Побеспокойтесь об её безопасности!

Приглашаем на бесплатный вебинар онлайн-курса «Криптографическая защита информации» — «Криптографическая защита при разработке»: регистрация

🔥Обсудим:
— принципы безопасной разработки: изучим основные принципы, которые должны соблюдаться разработчиками для минимизации уязвимостей и обеспечения безопасности приложений
— протоколы шифрования и хеширования: познакомимся с популярными протоколами и узнаем, как они используются для защиты данных
— адаптивное применение шифрования: выясним, в каких случаях шифрование является обязательным и когда оно может быть избыточным, чтобы эффективно применять защиту
— безопасное межсервисное взаимодействие: узнаем о методах безопасной реализации взаимодействия между различными сервисами и API

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: LjN8KB8pd

Читать полностью…

Senior C++ Developer

static_assert

static_assert — это механизм проверки условий компиляции. Он позволяет выдавать ошибку компиляции, если не выполняется некое условие.

Основные случаи использования:
— Проверка размера типов данных.
— Проверка наличия функций или методов у классов.
— Верификация определенных свойств на этапе компиляции.
— Проверка корректности шаблонных параметров.
— Выявление ошибок в зависимостях между типами данных.

Преимущества:
— Выявляет ошибки на этапе компиляции, не дожидаясь выполнения.
— Позволяет проверить условия, которые нельзя проверить во время выполнения.
— Улучшает читаемость кода за счет явных проверок.

static_assert широко используется в шаблонах и метапрограммировании.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Расскажите об использовании realloc в контейнерах.

realloc
используется в контейнерах динамической памяти, таких как vector, для изменения выделенной памяти при добавлении или удалении элементов.

realloc вызывается при заполнении текущего буфера в контейнере и память перевыделяется большими блоками (обычно в 2 раза больше). Это позволяет избежать постоянного выделения памяти заново.
Само перевыделение происходит автоматически, скрыто от разработчика.

При частых вызовах может привести к фрагментации памяти.

Читать полностью…

Senior C++ Developer

Алгоритм equal_range

equal_range — это алгоритм поиска из стандартной библиотеки, который находит диапазон элементов, эквивалентных заданному значению.

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

Применение:
— Поиск всех элементов, соответствующих значению.
— Получение диапазона для последующей обработки.
— Высокоэффективная альтернатива линейному поиску.

#это_база

Читать полностью…

Senior C++ Developer

Алгоритм partial_sort

partial_sort — это алгоритм сортировки из стандартной библиотеки, который упорядочивает только часть контейнера.
Сортирует элементы в диапазоне [first, middle). Элементы справа от middle остаются без изменений

При работе с частью данных эффективнее полной сортировки. Внутри использует алгоритм quicksort.

Применение:
— Быстрый поиск K наибольших/наименьших элементов.
— Сортировка только части большого массива данных.
— Оптимизация производительности по сравнению с полной сортировкой.

#это_база

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Что такое SIMD-инструкции?

SIMD-инструкции — это специальные команды процессора, которые работают с векторными регистрами и могут выполнять одну операцию над несколькими элементами данных параллельно.

Например, при сложении двух векторов из 4 float чисел, вместо 4 инструкций сложения, с SIMD можно выполнить одну команду, которая сложит эти вектора за одну операцию.

Основные преимущества SIMD:
— Повышение производительности за счет параллельных вычислений.
— Эффективное использование пропускной способности процессора.
— Уменьшение количества инструкций за счет векторизации.
— Оптимизация алгоритмов обработки массивов, матриц, фильтрации, графики.

Читать полностью…

Senior C++ Developer

Как избежать deadlock

Deadlock (взаимная блокировка) возникает, когда два или более потока заблокированы в ожидании ресурса, который удерживается другим потоком.
Чтобы избежать deadlock, нужно следовать следующим правилам:

— Не блокировать ресурсы в разном порядке в разных потоках.
— Не удерживать блокировку во время выполнения долгих операций.
— Использовать lock_guard или unique_lock вместо явных lock/unlock.
— Избегать вложенных блокировок одного и того же мьютекса.
— Применять порядок блокировки ресурсов, например, всегда в алфавитном порядке.
— Использовать мьютексы только для защиты данных, а не для управления логикой.

Соблюдая эти правила, можно предотвратить ситуации взаимной блокировки потоков и построить корректную многопоточную логику.

Читать полностью…

Senior C++ Developer

Алгоритм stable_partition

Алгоритм std::stable_partition используется для разбиения контейнера на две части по какому-либо условию.

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

Отличие от partition в том, что stable_partition сохраняет относительный порядок элементов. Те, что шли перед разбиением в одной группе, останутся в том же порядке после.
Это бывает важно, например, при разбиении по нескольким критериям.

В примере мы разделили вектор на две части — четные и нечетные числа. Благодаря stable_partition сохранен относительный порядок элементов в каждой части.

#это_база

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Как подсчитать количество элементов в std::list?

Чтобы подсчитать количество элементов в std::list, можно использовать следующие способы:

1. Вызвать метод size() самого списка. Он вернет количество элементов.
2. Проитерировать список циклом и считать элементы.
3. Воспользоваться алгоритмом std::distance, передав ему начало и конец списка.
4. Применить алгоритм std::count_if с условием, которое всегда истинно.

Читать полностью…

Senior C++ Developer

#вопросы_с_собеседований
Чем отличается конструктор копирования от оператора присваивания?

Конструктор копирования:
— Вызывается при создании нового объекта на основе существующего.
— Имеет сигнатуру ClassName(const ClassName&).
— Обычно выполняет полное копирование данных из одного объекта в другой.

Оператор присваивания:
— Вызывается при присваивании значений между существующими объектами.
— Имеет сигнатуру ClassName& operator=(const ClassName&).
— Часто выполняет поверхностное копирование, присваивая ресурсы.

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

Читать полностью…

Senior C++ Developer

Алгоритм is_partitioned

Алгоритм is_partitioned — это алгоритм из стандартной библиотеки algorithm, который проверяет, разбит ли диапазон элементов определенным образом.
Принимает три параметра:
— Два итератора, задающих проверяемый диапазон.
— Предикат (функцию или функтор), определяющий разбиение.
Возвращает bool значение — true если диапазон разбит согласно предикату и false в противном случае.

Этот алгоритм предпочтительнее цикла, т. к. проще в использовании и читабельнее, ведь он эффективно проверяет условие за один проход по последовательности.

В примере мы определяем предикат isEven для проверки четности числа, передаем его в is_partitioned вместе с вектором v и выводим результат.

#это_база

Читать полностью…

Senior C++ Developer

std::filesystem

std::filesystem
это библиотека для работы с файловой системой: файлами, каталогами, путями.
Она появилась в С++17 и используется для:

— Получения информации о файлах.
— Операций с каталогами.
— Работы с путями.
— Проверки существования файлов и каталогов.
— Обхода дерева каталогов, в т. ч. рекурсивного.
— Копирования и перемещения файлов, директорий.
— Синхронной и асинхронной работы с файлами.
— Работы с правами доступа и временными метками.

Читать полностью…
Subscribe to a channel