Изучаем C++. По вопросам сотрудничества: @adv_and_pr
std::data
std::data — это стандартная функция, которая возвращает указатель на недоступное буферное хранилище контейнера.
Она используется для непосредственного доступа к данным контейнера в памяти.
Основные применения:
— Прямой доступ к элементам массива или вектора для чтения/записи.
— Передача данных контейнера в функции, принимающие указатель в качестве аргумента.
— Выполнение операций, зависящих от порядка элементов в памяти.
— Оптимизации производительности за счёт избежания копирования.
— Низкоуровневые операции и интеграция с кодом на С.
— Итерация элементов в порядке хранения.
string at()
std::string::at() — это метод для доступа к символу строки по указанному индексу.
Принимает в качестве аргумента индекс символа типа size_t и возвращает ссылку на символ по данному индексу.
— Индексация начинается с 0 до size()-1.
— Выбрасывает исключение out_of_range, если индекс вне диапазона.
— Более безопасен, чем оператор [], так как проверяет границы.
Полезен в циклах для доступа к каждому символу, когда нужен безопасный доступ для чтения/записи конкретного символа.
#это_база
#вопросы_с_собеседований
Для чего нужен атрибут maybe_unused?
Атрибут [[maybe_unused]] используется для подавления предупреждений компилятора об неиспользуемых объектах.
Компилятор выдает предупреждение, если объект объявлен, но нигде не используется и чтобы избавиться от ложных предупреждений, например, когда объект используется только в отладочной сборке, применяют [[maybe_unused]].
Позволяет задать политику использования на уровне отдельных объектов и улучшает читаемость кода, явно объясняя причину неиспользования.
Разыскивается Senior C++/Qt Developer в команду разработчика офисного ПО МойОфис для участия в разработке кросс-платформенных редакторов.
Если ты хочешь работать в крупной российской ИТ-компании, имеешь опыт разработки С++ 11/14 от 3-х лет и разработка интерфейсов с использованием Qt - это то, чем тебе хотелось бы заниматься, - ты тот, кто нам нужен!
От нас: интересные задачи, возможность профессионального развития и обучения, удаленка или работа в офисе в историческом центре Питера и полный соцпакет с ДМС со стоматологией, оплачиваемым питанием и другими плюшками.
Подробности тут или в телеграм @VasilevaD
Алгоритм generate
std::generate — это алгоритм из стандартной библиотеки C++, который используется для заполнения диапазона элементов сгенерированными значениями.
Принимает три параметра: начало диапазона, конец диапазона и функцию генерации. Функция генерации должна принимать неявный счетчик и возвращать очередное значение.
Для каждого элемента в заданном диапазоне будет вызываться функция генерации, и результат будет записан в этот элемент.
В этом примере std::generate совместно с генератором случайных чисел используется для быстрого заполнения вектора случайными значениями.
#это_база
absl::btree
absl::btree — это реализация B-дерева в библиотеке Abseil для C++.
Преимущества absl::btree — это хранение данных в отсортированном порядке, быстрый поиск, вставка и удаление за O(logN), поддержка уникальных и неуникальных ключей, реализация set и map.
Применяется в задачах, где нужна высокопроизводительная структура данных с отсортированным доступом, например:
Реализация словарей и сортированных множеств;
Для хранения данных в базах данных;
В поисковых системах для индексов;
В структурах вроде кэша для быстрого доступа;
В задачах машинного обучения для хранения данных.
✅Бесплатный открытый урок по С++ от OTUS
Тема: Почему в C++ 13 способов передать параметр в функцию?
Дата: 22 августа, 20:00
Преподаватель: Павел Филонов, Ex-Data Science Manager в Kaspersky
Урок пройдёт в рамках курса «Специализация С++ Developer» от OTUS
🔹Что будет на занятии:
- синтаксис передачи параметров в функции;
- константы, указатели, ссылки, умные указатели, lvalue, rvalue, forward reference;
- практические советы по объявлению функций, основанные на C++ Core Guidelines.
🔸Чему вы научитесь:
- узнаете про разнообразие способов объявления параметров функции;
- сможете обоснованно выбирать, какой способ использовать в разных ситуациях.
Доступ к уроку бесплатный. После него вы сможете продолжить обучение на курсе, который доступен в рассрочку!
♦️Регистрация: https://otus.pw/Kuz07/Нативная интеграция. Информация о продукте www.otus.ru
Атрибут nodiscard
Атрибут nodiscard — это специальный атрибут-маркер, который указывает компилятору предупреждать при игнорировании возвращаемого значения функции или метода.
Он был добавлен в С++17 для улучшения качества кода, указывается перед объявлением функции или метода и информирует компилятор, что возвращаемое значение не должно игнорироваться.
Позволяет избежать логических ошибок при игнорировании важных результатов функции.
В этом примере функция getResult() помечена атрибутом [[nodiscard]].
При вызове getResult() без использования возвращаемого значения компилятор выдаст предупреждение об игнорировании результата.
std::size
std::size — это функция из стандартной библиотеки C++, которая возвращает размер контейнера или массива.
Она определена в заголовочном файле <iterator>, работает со всеми стандартными контейнерами (vector, deque, list, array и др.) и с массивами всех типов, позволяя получить размер контейнера или массива в runtime.
#это_база
insert_or_assign
insert_or_assign — это функция из стандартной библиотеки языка C++, добавленная в C++17. Она используется для вставки элемента в ассоциативный контейнер (например, std::map) или обновления значения элемента, если ключ уже существует.
Преимущества перед operator[]:
— Более безопасна, так как проверяет существование элемента.
— Избавляет от лишнего кода для проверки наличия ключа.
#вопросы_с_собеседований
Почему std::make_pair больше не нужна?
В новых стандартах C++ она утратила актуальность по нескольким причинам:
— Появились инициализаторы со скобками {} для создания std::pair напрямую.
— Для вставки в контейнеры теперь есть функция emplace(), которая конструирует элемент прямо на месте.
— Можно использовать агрегатную инициализацию.
— Инициализаторы из C++17 позволяют сразу указывать ключ и значение.
На языке C++ можно создавать с нуля самые разные программы: от беспилотных автомобилей и робототехники до веб-браузеров, микроконтроллеров, серверов и видеоигр. Если вы когда-нибудь мечтали менять мир, то проще всего начать делать это в цифровом виде и на этом языке. А ещё С++ даёт крепкую базу знаний. Выучив его, вам будет проще освоить любой смежный инструмент.
Обучиться языку можно на курсе Яндекс Практикума «Разработчик C++».
На курсе вы:
• научитесь писать эффективный код;
• разберётесь в стандартной библиотеке C++;
• начнёте работать с Git, IDE и компиляторами;
• познакомитесь с базовыми алгоритмами и структурами данных;
• создадите действующие сервисы и добавите 3+ проекта в портфолио.
На всех этапах вас будут сопровождать опытные разработчики: мы не дадим просесть по учёбе и поможем выкроить время на образование. Вы будете практиковаться на реальных кейсах и положите в портфолио работающие проекты. А карьерные консультации подготовят вас к разговору о повышении или помогут с поиском новой работы.
Пройдите первый бесплатный урок
msg_ptr (message pointer)
msg_ptr это указатель на структуру или класс, который содержит данные сообщения. Обычно это просто указатель void*.
Он используется в многопоточном программировании для передачи сообщений между потоками.
Использование указателей вместо копирования данных позволяет избежать лишних копий и ускорить передачу сообщений между потоками.
Если запустить код из примера, можно увидеть, что данные успешно передаются между потоками через очередь с использованием указателей на сообщения.
std::tuple
std::tuple - это шаблонный класс, представляющий собой фиксированный набор элементов разных типов. Проще говоря, удобный инструмент для упаковки данных разных типов
Элементы tuple инициализируются в конструкторе и доступны только для чтения после создания.
tuple часто используется в комбинации с tie для присваивания кортежа переменным.
#это_база
Куда делись все безработные С++ разработчики?
Если ты один из них, то с вероятностью в 99.99% ты просто еще не подписан на С++ Работа Вакансии. Это же те самые каналы, где работу умудряются найти даже самые зеленые джуны.
Я уже молчу про мидлов, которые тут просто нарасхват!
Авторы канала сканируют рынок и отбирают самые вкусные вакансии на должность С++ разработчика.
Всем новым подписчикам категорически рекомендуется чекнуть в канале посты-закрепы с подборкой 20 нейросетей, которые помогут вам существенно упростить поиск новой работы.
С++ Работа Вакансии – «мастхэв-канал» для каждого начинающего С++ Разработчика!
🦾 Пройди тест по C++ 🦾
Проверь свои знания. Сможешь сдать — пройдёшь на продвинутый курс "C++ Developer. Professional" от OTUS по специальной цене.
После 5 месяцев обучения:
- Научишься прикладному применению стандартов C++11 / C++14 / C++17.
- Освоишь асинхронное и многопоточное программирование.
- Получишь глубокое представление о шаблонной магии и паттернах проектирования.
В конце обучения тебя ждет проектная работа.
🎫Курс можно приобрести в рассрочку
👉 ПРОЙТИ ТЕСТ: https://otus.pw/NSb0/Нативная интеграция. Информация о продукте www.otus.ru
Лямбда-выражения
Лямбда-выражения (lambda) — это безымянные функции, которые можно использовать для передачи поведения или сравнения.
Объявляются как {body;}, в квадратных скобках указываются аргументы, в фигурных — тело.
Полезны для задания функций сравнения, например в алгоритмах sort(), когда нужно быстро передать функциональность, не создавая отдельную функцию.
Поддерживают захват по значению [=] и по ссылке [&].
Можно сохранить в переменной с помощью auto.
#это_база
#вопросы_с_собеседований
Для чего нужен атрибут fallthrough?
Атрибут [[fallthrough]] используется для явного указания того, что в конструкции switch нужно пропустить break в конце case и перейти к выполнению следующего case.
По умолчанию в С++17 и новее переход между case без break приводит к ошибке компиляции и чтобы сохранить старое поведение и разрешить переход, нужно добавить [[fallthrough]].
Это улучшает читаемость кода, явно указывая на отсутствие break и помогает избежать случайного отсутствия break, когда разработчик забыл его добавить.
[[fallthrough]] также полезен при рефакторинге старого кода с switch в современный стандарт С++.
#вопросы_с_собеседований
Может ли inline-функция быть рекурсивной?
Поскольку компилятор просто встраивает код inline-функции в место вызова, не имеет значения, является ли эта функция рекурсивной или нет. Компилятор будет просто копировать один и тот же код функции при каждом рекурсивном вызове.
Таким образом, рекурсивные inline-функции абсолютно допустимы и часто используются, когда нужна рекурсия без накладных расходов на стандартные вызовы функций.
std::clamp
std::clamp — это функция из стандартной библиотеки, которая позволяет ограничить значение в заданном диапазоне.
Функция принимает значение, нижнюю и верхнюю границы и возвращает исходное значение, если оно входит в диапазон, или же возвращает ближайшую границу, если значение вне диапазона.
Применяется для:
— Ограничения числовых значений в заданных пределах.
— Обработки данных из недостоверных источников.
— Защиты от переполнения/обрезания данных.
— Нормализации данных в ML и компьютерном зрении.
— Реализации игровой логики в движках.
— Обработки аудио- и видео- сигналов.
#вопросы_с_собеседований
Что такое сложность алгоритма и от чего она зависит?
Сложность алгоритма - это количественная характеристика его эффективности, которая показывает, как зависят затраты ресурсов (времени, памяти) от размера входных данных.
Сложность зависит от:
— Объема операций, которые алгоритм выполняет при обработке данных.
— Количества итераций циклов, рекурсивных вызовов.
— Зависимости числа операций от размера входных данных.
— Операций внутри вложенных циклов и структур.
Чем быстрее растёт сложность функции с ростом входных данных, тем менее эффективен алгоритм.
Функция strrchr()
Функция strrchr(), объявленная в заголовочном файле <cstring>, ищет последнее вхождение указанного символа в строке и возвращает указатель на это вхождение.
Принимает два параметра: указатель на строку и символ для поиска, возвращает указатель на последнее вхождение символа в строке. Если символ не найден, возвращается нулевой указатель.
Полезна, когда нужно найти последнее вхождение разделителя, например точки в URL.
В примере функция strrchr() возвращает указатель на найденный символ, мы вычитаем из этого указателя начало строки, чтобы получить позицию последней точки.
#это_база
Видим цель, не видим препятствий: зовем на курс по архитектуре приложений 🧑🏼💻
Работа в проектах, где в коде не разобраться, похожа на путешествие по горной тропе без карты. Возможно, этот островок кода выглядит не очень надежно и его можно удалить? Бам! — и всё, что могло упасть, упало.
Ситуация гипотетическая, сравнения взяты из реальной жизни — а мы хотели подвести к важности грамотного, выстроенного кода. Учим, как делать такую красоту, на курсе по архитектуре приложений, поток стартует 18 сентября.
Узнать программу вы можете по ссылке ⚡️
Спикеры курса:
✔️Егор Лукьянов, Senior software engineer
Более 15 лет в IT, отвечает за архитектуру платформы анализа больших данных. Руководит бэкенд-разработкой на Python.
✔️Александр Вагнер, Solution Architect & co-founder в TorrowTechnologies
Более 8 лет в IT, строит с нуля компанию и платформу Torrow. Имеет богатый опыт создания и разработки high-load веб-сервисов и приложений.
Записаться на поток с 18 сентября вы можете на нашем сайте ✨
Не хочешь проср#ть собес по алгоритмам?
Если ты давно откладывал алгоритмы и не знаешь, с чего начать — это твой шанс⭐️
71% наших учеников уже получили офферы в крупные IT-компании. Хочешь стать следующим?
Помогаем заботать алгоритмы на задачах из собеседований в Яндекс, Тинькофф, ВК на курсе:
"АЛГОРИТМЫ: ROADMAP для получения офферов в IT!"
☝️Он лучше аналогов, и вот почему:
➡️Структурная подача материала. Информация собрана за вас, вам не нужно искать по всему интернету ответы на вопросы. Плюс есть куратор и препод, у которого можно спросить все, что не понятно.
➡️ Много практики. 100+ задач, которые вы решите сами. За счет постепенного роста сложности задач, вы выработаете большую уверенность в том, что сможете решать алгоритмы.
➡️Каждую неделю вы будете разбирать задачи из СОБЕСЕДОВАНИЙ. Научитесь уверенно решать задачки medium и hard на Leetcode и пройдете собеседования.
➡️У вас будет личный куратор-трекер, который напоминает о ДЗ. Вы получите МОТИВАЦИЮ изучить алгоритмы.
➡️Поддержка от сообщества единомышленников. Для участников будет групповой чат. Благодаря коммьюнити и общению вы получите удовольствие от процесса, а в этом состоянии вы максимально продуктивны.
Первому человеку, который пройдет весь курс до конца первым — полностью возместим деньги за обучение💲
🔥 До 18.08 можно присоединиться к 5 потоку с самой большой скидкой в году —20%.
✔️Оставляй заявку на бесплатную консультацию, где мы вместе с экспертом составим твой персональный RoadMap развития по алгоритмам:
🌐https://clck.ru/35LchU
Нашли подборку лучших курсов по С++ разработке!
Tutortop — образовательный маркетплейс №1, где представлено свыше 5000 курсов от более чем 300 школ и все их можно сравнить по рейтингу, цене и отзывам, а еще купить дешевле, чем напрямую 🔥
Ребята из tutortop собрали для вас подборку из лучших курсов по С++ по мнению их пользователей:
— Разработчик С++ от Нетологии. Рейтинг 4.8 из 5.
Скидка 50% по промокоду TUTORTOP50 до 18.08🎁
— Менеджмент IT-проектов от МИПО. Рейтинг 4.8 из 5.
Скидка 10% по промокоду TUTORTOP до 18.08🎁
— Геймплей-программирование от XYZ School. Рейтинг 4.7 из 5.
Скидка 10% по промокоду TUTORTOP до 18.08🎁
Чтобы подробнее узнать про обучение или купить его, введите промокод TUTORTOP по ссылке на онлайн-курс по C++, который вам интересен.
⚡️Учиться выгоднее с tutortop!
try_emplace
Метод try_emplace() в C++17 - это один из способов вставки элемента в ассоциативный контейнер (например, map или unordered_map).
Позволяет вставить новый элемент по ключу, если такого ключа еще нет в контейнере.
Если ключ уже существует, то ничего не происходит.
Преимущества:
- Более эффективно, чем insert, т.к. сразу конструирует элемент на месте.
- Не делает лишних копирований или перемещений.
- Позволяет избежать ненужного перезаписывания элемента по существующему ключу.
Функция before_begin()
Метод before_begin() контейнера forward_list возвращает итератор, указывающий на позицию перед первым элементом списка.
Это полезно, например, чтобы вставить элемент в начало списка.
Работает за константное время O(1), т.к. получает ссылку на начало списка.
#это_база
#вопросы_с_собеседований
Что такое union?
Union - это специальный класс, который позволяет хранить данные разных типов в одной области памяти.
Основные характеристики:
- Объявляется с ключевым словом union.
- В каждый момент активно только одно поле.
- Размер равен наибольшему полю.
- Позволяет интерпретировать одну область памяти разными способами.
- Экономит память.
- Доступ к полям как в обычном классе.
#вопросы_с_собеседований
Что такое рефакторинг?
Рефакторинг - это процесс изменения внутренней структуры программы без изменения ее внешнего поведения.
Рефакторинг кода может применяться в следующих ситуациях:
- Улучшение читаемости и понятности кода.
- Оптимизация производительности.
- Устранение дублирования кода.
Рефакторинг особенно важен при работе над большими проектами, где код многократно изменяется и расширяется. Он позволяет поддерживать кодбейз чистым, современным и масштабируемым.
Ключевое слово const
Ключевое слово const используется для создания констант и неизменяемых объектов.
- Const для объявления переменных: запрещает изменение объекта после инициализации.
- Const указатели и ссылки: указатель или ссылка на константный объект. Нельзя изменить объект через них, только читать.
- Функции, возвращающие const значения: гарантируют, что функция не изменит объект.
- Const члены класса: нельзя изменить через объект класса.
- Const методы класса: не меняют члены класса. Часто применяются к getter-методам.
#это_база