11482
Изучаем C++. По вопросам сотрудничества: @adv_and_pr РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
❓ Вопрос на собеседовании
Как работает Rule of Five в C++ и когда его следует применять?
Ответ ⬇️
Rule of Five говорит о том, что если ваш класс управляет ресурсами, вам нужно явно определить пять специальных методов: конструктор копирования, оператор присваивания копированием, конструктор перемещения, оператор присваивания перемещением и деструктор. Это важно, чтобы избежать утечек ресурсов или неправильного управления памятью при копировании или перемещении объектов.
absl::btree
absl::btree — это реализация B-дерева в библиотеке Abseil для C++.
Преимущества absl::btree — это хранение данных в отсортированном порядке, быстрый поиск, вставка и удаление за O(logN), поддержка уникальных и неуникальных ключей, реализация set и map.
Применяется в задачах, где нужна высокопроизводительная структура данных с отсортированным доступом, например:
Реализация словарей и сортированных множеств;
Для хранения данных в базах данных;
В поисковых системах для индексов;
В структурах вроде кэша для быстрого доступа;
В задачах машинного обучения для хранения данных.
#вопросы_с_собеседований
Может ли inline-функция быть рекурсивной?
Поскольку компилятор просто встраивает код inline-функции в место вызова, не имеет значения, является ли эта функция рекурсивной или нет. Компилятор будет просто копировать один и тот же код функции при каждом рекурсивном вызове.
Таким образом, рекурсивные inline-функции абсолютно допустимы и часто используются, когда нужна рекурсия без накладных расходов на стандартные вызовы функций.
#вопросы_с_собеседований
Что быстрее: постфиксные инкрементные операторы или префиксные? Чем отличается их сигнатура?
Префиксные операторы быстрее. В постфиксных операторах производится дополнительная операция сохранения предыдущего состояния объекта, а затем только увеличение на 1, а в префиксном операторе после инкрементирования объекта, сразу возвращается ссылка объект.
Сигнатура их отличается фиктивным параметром int у постфиксного оператора.
#вопросы_с_собеседований
Что лучше: const или define?
Ответ:
define - это директива препроцессора, которая не учитывает ни типов, ни областей видимости. Препроцессор вставляет значение везде, где оно используется и создается множество копий 3.14159265359 в объектном коде, константа никогда не порождает больше одной копии этого значения. define трудно отлаживать, потому что у него нет имени, только магическое число, нельзя взять адрес или создать ссылку на это значение.
У const есть тип, область видимости, можно взять адрес, создать константную ссылку на эту переменную.
Определенно, лучше использовать const, а не define.
Быстрая сортировка
Отсортируйте заданный массив с помощью быстрой сортировки.
Формат входных данных:
Первая строка входных данных содержит одно натуральное число nn (1 ≤ n ≤ 10^5) – количество элементов в массиве. В следующей строке находятся элементы массива – n целых чисел, не превосходящих по абсолютной величине 10^9.
Формат выходных данных:
Выведите элементы массива в порядке неубывания.
Автоматический вывод типа аргумента шаблона класса
Выглядит название этой возможности довольно длинным и сложным, но на самом деле ничего сложного тут нет. Основная идея в том, что в C++17 вывод типов аргументов шаблонов выполняется и для стандартных шаблонов классов. Ранее это поддерживалось лишь для функциональных шаблонов. В результате оказывается, что раньше писали так:
std::pair<std::string, int> user = {"M", 25};
std::pair user = {"M", 25};
std::tuple<std::string, std::string, int> user ("M", "Chy", 25);
std::tuple user2("M", "Chy", 25);
Современные возможности C++ и проверенные паттерны: активный объект, внешний полиморфизм и корутины
В этой статье автор показывает, как внешний полиморфизм (реализация полиморфного поведения вне объекта, для которого такое поведение требуется) помогает писать красивые и чистые программы, и рассказывает о некоторых базовых и продвинутых способах реализации.
Смотреть статью
Особенности реализации STL в Clang, GCC и Microsoft С++
Смотреть статью
Главная конференция по бизнесу в Telegram
31 октября в Москве пройдёт первая конференция по Telegram от крупнейшего сервиса аналитики Telemetr. Топы Телеграм-рынка, маркетологи и представители бизнеса обсудят самые актуальные тенденции и перспективы развития платформы Telegram.
Присоединиться к мероприятию можно будет и онлайн. Тут найдёте всю информацию - https://telemetr.pro.
На конференции вас ждут:
- 20+ опытных спикеров
- 1000+ онлайн и офлайн участников
- две сцены
- нетворкинг активности
- лаунж зона
- вкусный фуршет
- яркое afterparty в PAPA Moscow
Спикерами главной сцены будут: Артемий Лебедев, руководитель Telemetr - Денис Ларионов, основатель агентства GoDigital - Сурен Альбертян, основатель Сидорин ЛАБ - Дмитрий Сидорин и многие другие!
За подробностями сюда - https://telemetr.pro
А купить билет со скидкой в 10% можно, использовав наш промокод - TMConf10
Купить билет - https://telemetr.pro
this удобно использовать для цепочных вызовов
Мы можем вернуть ссылку на объект, на котором мы вызываем метод класса:
Foo &set(int x) { this->x = x; return *this; }
Здесь метод set возвращает ссылку на объект класса Foo(Foo&). Такая реализация метода позволяет нам писать код, подобный этому:obj.set(2).set(8);Это возможно, поскольку первый вызов метода set возвращает указатель на объект obj. Второй метод вызывается на объекте obj, т. е. можно переписать код так:
obj = obj.set(2);
obj = obj.set(8);
Читать полностью…
this является const указателем
Указатель this является неизменяемым указателем. Убедимся это на примере:class Foo {Здесь в методе change мы пытаемся присвоить указателю this новое значение.
private:
int x;
public:
Foo(int x = 0) { this->x = x; }
void change(Foo *foo) { this = foo; }
void print() { cout << x << endl; }
};
Попробуем вызвать метод change в методе main:Foo obj (3);Если мы запустим код, то получим ошибку компиляции в методе change (lvalue required as left operand of assignment). Компилятор не позволяет нам изменить значение указателя this.
Foo *ptr;
obj.change(ptr);
obj.print();
Хотите узнать, как превратить массив в пирамиду и ускорить сортировку данных?
Ждем вас на бесплатном вебинаре 14 октября в 20:00 мск, где мы разберем:
- как реализовать алгоритм сортировки выбором с линейной сложностью;
- как превратить массив в пирамиду (кучу) для быстрого доступа к максимальному элементу;
- как создать алгоритм пирамидальной сортировки с квазилинейной сложностью — О(N log N);
- визуальные примеры работы алгоритма на конкретных числах.
🚀 Спикер Евгений Волосатов — программист баз данных и преподаватель с огромным и разнообразным опытом, автор статей и учебных программ по C#, Java, PHP.
Встречаемся в преддверии старта курса «Алгоритмы и структуры данных». Все участники вебинара получат специальную цену на обучение!
Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cCdPhDРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Довериться Вселенной и ждать, когда она сама тебя найдёт
💚 Подписаться на Avito Career и получать вакансии прямо в мессенджере.
В канале публикуют предложения для разных грейдов и направлений. От бэкенд-разработчиков до тимлидов.
Получайте актуальные вакансии и стажировки в Авито 👉 Подписывайтесь!
#Вопросы_с_собеседования
Что выведет код сверху?
Ответ:
10
Объяснение:
Подобно struct и class, union может иметь методы. Подобно struct и в отличие от class, члены union по умолчанию являются общедоступными.
Поскольку данные-члены объединения совместно используют память, значение b становится таким же, как a.
➡️ Использование std::flat_map для оптимизации производительностиstd::flat_map — это структура данных, которая представляет собой ассоциативный контейнер, хранящий пары "ключ-значение" в упорядоченном виде с использованием вектора.
В отличие от std::map, std::flat_map оптимизирован для случаев, когда количество элементов невелико, так как хранение данных в последовательной области памяти снижает накладные расходы и улучшает кэширование.• std::flat_map полезен для приложений, где требуется высокая производительность при небольших объемах данных и частых поисках.
Пс...
Тут два С++ сеньора создали канал, где простым языком поясняют за плюсы, метапрограммирование, фишки новых стандартов, алгоритмы, вопросы с собеседований и другие непонятные штуки из современного программирования на С++.
Прямо сейчас Вы можете бесплатно забрать гайды по собеседованиям, по категориям выражений и мув-семантике и по ключевому слову inline. Все найдете в закрепе канала.
Подписывайтесь, чтобы пояснять друзьям за оптимизации компилятора, о которых вам никто не расскажет: Грокаем С++
#вопросы_с_собеседований
Какие отличия у std::array и std::vector?
std::array — это обёртка вокруг обычного массива, фиксированного размера, а std::vector - это динамически расширяемый массив. std::array хранит свои данные в стековой памяти, а vector выделяет память в куче (динамическая память). У std::array в параметрах шаблона указывается тип хранимых элементов и размер массива. А у std::vector - тип элементов и ещё возможно указать аллокатор, который нужно использовать при выделении памяти (с помощью new). std::array чуть лучше по производительности в случае небольшого массива, чем std::vector, который содержит в себе несколько указателей, которые указывают на выделенный в куче кусок памяти.
🔥 Weekend Offer Backend в Яндекс 26–27 октября
Устройтесь backend-разработчиком в Яндекс онлайн за одни выходные.
↔️ К участию приглашаем разработчиков на C++, Python, Go, Java или Kotlin, с опытом коммерческой разработки от трёх лет, которые готовы работать в офисном или гибридном режиме на территории России или Республики Беларусь.
🛐План простой: зарегистрируйтесь и до 23 октября решите пару задачек в Контесте, 26 октября пройдите два технических собеседования, а 27 октября получите офер.
🔛В Weekend Offer Backend участвуют разные сервисы: Финтех, HR-Tech, Образование, МВА, Биллинг, Геосервисы, Реклама, Поисковые сценарии. Чтобы заранее подумать, с кем вам хочется пообщаться 17 октября мы проведем онлайн-встречу в зуме, где команды расскажут о себе и задачах.
🆖 Узнать подробности и принять участие можно здесь.
Yandex Cloud запустил сервис для ускорения разработки продуктов в облаке Yandex Serverless Integrations
Теперь разработчики смогут при минимальном написании кода автоматизировать различные процессы, например обработку онлайн-заказов и мониторинг систем безопасности.
Сделать это можно благодаря инструменту Yandex Workflows — он позволяет описать последовательность операций с помощью декларативного языка YAML. Сервис автоматически запустит эти процессы и проконтролирует их выполнение.
Помимо этого, Yandex Serverless Integrations включает в себя инструменты EventRouter для передачи событий между сервисами и API Gateway для создания шлюзов между внешними и облачными сервисами по спецификации OpenAPI 3.0.
Читайте подробнее в статье
#вопросы_с_собеседований
Виртуальный конструктор: что он собой представляет?
Ответ:
Это каверзный вопрос с IT-собеседований, который чаще всего задают после виртуальных деструкторов, чтобы запутать. Конструктор не может быть виртуальным, поскольку в этом нет никакого смысла: при создании объектов нет такой неоднозначности, как при их удалении.😁
🌐Научитесь создавать сетевые сервисы на C++ с помощью фреймворка userver!
Приглашаем вас на открытый вебинар 17 октября в 20:00 МСК, где мы подробно разберем:
- Как подключить userver в проект;
- Как собрать userver с нужной конфигурацией;
- Как написать сетевой сервис, работающий с REST и WebSocket API;
- Как реализовать аутентификацию для нового сервиса.
🎓 Встречаемся в преддверии старта курса «C++ Developer. Professional». Все участники вебинара получат специальную цену на обучение!
🔗Регистрируйтесь прямо сейчас, чтобы не пропустить это важное мероприятие: https://otus.pw/4ykh/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Метод map::max_size()
map::max_size() — это встроенная функция C++ STL, которая возвращает максимальное количество элементов, которые может содержать контейнер map.
Алгоритм rotate
Меняет местами элементы в диапазоне [first, last) таким образом, что элемент n_first становится первым в новом диапазоне, а n_first-1 — последним.
Параметры:
first, last - диапазон элементов для изменения их порядка.
n_first - элемент, который должен стать первым в новом диапазоне.
Изучение физического движка Bullet Physics. Часть 2. Примеры
Смотреть статью
Senior-разработчик создал крутейший канал про SQL
Благодаря простым картинкам даже новичок научится разрабатывать приложения с использованием баз данных.
Присоединяйтесь: @SQL
➡️ Использование библиотеки NanoRange для работы с диапазонами в стиле C++20
NanoRange приносит функциональность диапазонов (Ranges) из C++20 в более ранние версии стандарта C++.
Она позволяет использовать удобные и гибкие инструменты для работы с последовательностями, такими как фильтрация, трансформация и ленивые вычисления, что делает код более чистым и выразительным.• NanoRange идеально подходит для проектов, работающих на стандартах C++11, C++14 или C++17, но желающих использовать преимущества std::ranges.
🔗 Ссылочка на доку
➡️ Использование std::expected для обработки ошибок без исключенийstd::expected — это новый шаблонный класс, добавленный в C++23, который предоставляет способ возвращать либо ожидаемое значение, либо информацию об ошибке. Он позволяет более эффективно обрабатывать ошибки без использования исключений, делая код более чистым и понятным.• std::expected полезен, когда нужно явно работать с ошибками, избегая накладных расходов и сложностей, связанных с исключениями.
➡️ Библиотека Cpprestsdk
Cpprestsdk (C++ REST SDK) — это библиотека для создания кроссплатформенных приложений, которые работают с RESTful веб-сервисами. Она предоставляет удобные классы для работы с HTTP-запросами, веб-сокетами и JSON в C++.• Если вам нужно взаимодействовать с веб-сервисами или создать клиент-серверное приложение, Cpprestsdk — отличный выбор для упрощения работы с сетью.
🔗 Ссылочка на доку
Перегрузка операторов
Ключевое слово operator позволяет изменить работу конкретного оператора с экземплярами класса. Это дает оператору дополнительное значение — "перегружает" его. Компилятор различает разные значения оператора, проверяя типы его операндов.
В примере оператор + перегружается для сложения двух комплексных чисел.