11482
Изучаем C++. По вопросам сотрудничества: @adv_and_pr РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Можно ли в C++ умножать или делить целое значение на степени двойки, не используя операций "*" или "/"?
Это можно делать в любом языке, где есть побитовый сдвиг. Умножению значения x на 2, например, соответствует операция x << 1, а делению y на 4 - действие y >> 4.
Bitset
Bitset — это контейнер в C ++ Standard Library Library для работы с данными на битовом уровне.
Набор битов хранит биты (элементы только с двумя возможными значениями: 0 или 1). Тем не менее, мы можем получить часть строки, предоставив позиции конструктору bitset (позиции относятся к позиции строки слева направо).
Подробнее можно почитать здесь.
Функция none_of()
Эта функция возвращает true, если ни один из элементов не удовлетворяет данному условию, иначе возвращает false.
Поскольку все элементы положительны, функция возвращает true.
KISS (Keep it Simple, Stupid)
Этот принцип программирования подразумевает использование наиболее простых и понятных решений. В С++ этот принцип может быть применен в различных областях, включая проектирование алгоритмов, написание кода и дизайн классов.
При проектировании алгоритмов важно использовать простые и понятные методы, которые легко понимаются другими программистами.
При написании кода важно использовать простые и понятные функции, которые выполняют только одну операцию. Например, вместо написания одной сложной функции, которая выполняет множество операций, можно написать несколько простых функций, которые выполняют каждую операцию отдельно.
При дизайне классов важно использовать простые и понятные методы, которые выполняют только одну операцию. Например, вместо создания одного сложного класса, который выполняет множество операций, можно создать несколько простых классов, каждый из которых выполняет отдельную операцию.
*На изображении представлен класс, удовлетворяющий принципу KISS
Где можно использовать префиксные деревья?
При реализации множеств и ассоциативных массивов.
А где можно посмотреть, как выполняется алгоритм ассоциативного массива на основе префиксного дерева?
На нашем открытом онлайн-уроке!
Мы выполним визуальное тестирование загрузкой 2000 слов в массив англо-русского словаря
Вебинар «Префиксное дерево» проведёт Евгений Волосатов, программист БД с 25-летним опытом
👨💻🛠👨🏻💻 Будет интересно: junior-разработчикам на любых языках программирования
🗓 7 октября, 20:00 МСК
Бесплатно в рамках старта курса «Алгоритмы и структуры данных»
➡️ Записаться на открытый урок: https://vk.cc/cBK4ZKРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
➡️ Оптимизация доступа к элементам через std::deque с использованием индексацииstd::deque — это контейнер, который позволяет эффективное добавление и удаление элементов как с начала, так и с конца. В отличие от std::vector, std::deque обеспечивает постоянное время доступа к элементам как в начале, так и в конце контейнера.• Используйте std::deque в тех случаях, когда вам нужен быстрый доступ к элементам по индексу, но также важна возможность эффективного добавления и удаления элементов с обоих концов контейнера.
➡️ Библиотека SQLiteCpp
SQLiteCpp — это тонкая обертка вокруг SQLite, одной из самых популярных легковесных реляционных баз данных. Библиотека предоставляет удобный и безопасный интерфейс для работы с SQLite в C++, облегчая взаимодействие с базами данных.• Если вам нужно встроить простую, но мощную базу данных в ваше C++ приложение, SQLiteCpp — это то, что вам нужно.
🔗 Ссылочка на доку
Как в С++ обрабатывать ошибки в конструкторах без исключений?
Самый очевидный способ обработки ошибок — это возврат значений. Но конструкторы не возвращают значения, поэтому так поступить нельзя. Это и было одной из причин, по которой исключения появились в С++.
Смотреть статью
#вопросы_с_собеседований по Си
Что такое void указатель? Можно ли разыменовать указатель void, не зная его типа?
void указатель — это указатель, который можно использовать для указания на любые данные любого произвольного типа. Указатель void может быть разыменован только после явного приведения. Например:int a = 5;
void *b = &a;
printf(“%d\n”, *((int*)b));
Алгоритм search
Ищет последовательность [first1, last1) для первого вхождения подпоследовательности, определенной [first2, last2), и возвращает итератор в свой первый элемент вхождения, или last1, если вхождения не найдены.
Удаление элементов
Для удаления элементов из контейнера list могут применяться следующие функции:
clear(p): удаляет все элементы
pop_back(): удаляет последний элемент
pop_front(): удаляет первый элемент
erase(p): удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
erase(begin, end): удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент
Применение всех функций представлено на картинке.
◀️Собеседование SENIOR С++
В этом видео разработчик из Яндекса попробует свои силы в mock-интервью по С++.
Смотреть видео
Алгоритм lower_bound
Возвращает итератор, указывающий на первую позицию в отсортированной последовательности, ограниченной диапазоном [first, last), в которую можно вставить значение value, не нарушая упорядоченности.
Один день, два города, два митапа для бэкенд-разработчиков
Записывайте дату — 17 октября, день митапов для бэкенд-разработчиков в Москве и Санкт-Петербурге:
👉 Яндекс Go Product Engineering Meetup #3, Москва. Поговорим об интеграциях систем, сложностях и решениях корнер-кейсов на примере продуктов внутри Яндекс Такси. В программе воркшоп, доклады и тусовка.
Зарегистрироваться
👉 Foodtech Tour, Санкт-Петербург. Обсудим новые сценарии и стартапы в корпорации. Поделимся докладами о том, как запускали аптеки в Яндекс Лавке, интегрировали Яндекс Маркет с китайскими маркетплейсами и создавали свои умные велосипеды для курьеров Яндекс Еды. После докладов устроим открытый микрофон со спикерами и афтепати.
Зарегистрироваться
Зовите коллег и оставляйте заявки на митапы! Обратите внимание, количество мест ограничено. После регистрации обязательно дождитесь подтверждения заявки.
Реклама. ООО "ЯНДЕКС.ТАКСИ". ИНН 7704340310.
Узнаем сколько лет человеку по дате его рождения
Для расчета возраста человека по дате его рождения в C++ можно использовать следующий код
В этом коде мы запрашиваем у пользователя его дату рождения, а затем получаем текущую дату с помощью функции time. Затем мы используем структуру tm для извлечения года, месяца и дня из текущей даты и вычисляем количество полных лет с помощью формулы now->tm_year + 1900 - year. Если текущий месяц и день меньше, чем месяц и день рождения, мы уменьшаем возраст на 1. Наконец, мы выводим результат на экран.
#вопросы_с_собеседований
Как сгенерировать pure virtual function call исключение?
Ответ:
Нужно вызвать чисто виртуальный метод в конструкторе родительского класса т.е. до создания дочернего, в котором этот метод реализован. Т.к. современный компилятор не даст это сделать напрямую, то нужно будет использовать промежуточный метод.
C++ для Maya
Создание кастомного локатора. В этой статье автор делится опытом, который приобрел при написании плагина на C++ для Maya.
Смотреть статью
Спецификатор thread_local
Спецификатор thread_local позволяет создавать переменные, которые будут иметь своё значение для каждого потока, в который они будут загружены. То есть, каждый поток будет иметь свою собственную копию этой переменной.
Это может быть полезным в ситуациях, когда необходимо иметь глобальную переменную, доступную для каждого потока, но значение этой переменной должно быть уникальным для каждого потока.
В данном примере мы создали переменную x с помощью спецификатора thread_local. Затем мы создали функцию increment(), которая инкрементирует значение переменной x и выводит его на экран.
В функции main() мы создали два потока и передали им функцию increment(). Каждый поток будет иметь свою собственную копию переменной x, поэтому при выполнении функции increment() в каждом потоке будет изменяться только своя копия переменной x. После выполнения обоих потоков мы ожидаем завершения их работы с помощью метода join().
➡️ Boost.MultiIndex — мощная библиотека для работы с контейнерами с множественной индексацией
Boost.MultiIndex — это часть популярной библиотеки Boost, которая предоставляет контейнеры с возможностью множественной индексации данных. Она позволяет хранить элементы в одном контейнере, но доступ к ним может осуществляться по разным критериям. Эта библиотека объединяет функциональность стандартных контейнеров, таких как std::set и std::map, в одном универсальном решении.• Boost.MultiIndex — отличный выбор, если вам нужно эффективно управлять данными с различными критериями поиска и сортировки. Она упрощает создание сложных структур данных, поддерживающих несколько способов доступа к элементам.
🔗 Ссылочка на доку
➡️ Оптимизация работы с большими объектами с помощью std::move и семантики перемещенияstd::move — это функция, которая превращает объект в "rvalue" (правостороннее значение), позволяя использовать семантику перемещения вместо копирования. Это особенно полезно при работе с большими объектами, где копирование может быть дорогим.• В этом примере используется std::move, чтобы передать большой объект LargeObject в функцию processLargeObject с использованием семантики перемещения. Вместо дорогостоящего копирования большого массива, память просто передается новому объекту, что значительно улучшает производительность.
➡️ Сжатие данных с использованием std::vector::shrink_to_fitstd::vector::shrink_to_fit — метод, который позволяет уменьшить емкость вектора до его фактического размера. Это полезно, когда нужно освободить память, занимаемую неиспользуемыми элементами, особенно после значительного сокращения размера вектора.• Вектор заполняется 100 элементами, после чего большая часть элементов удаляется. Использование shrink_to_fit позволяет уменьшить емкость вектора до текущего количества элементов, что освобождает ненужную память.• Используйте shrink_to_fit, когда нужно минимизировать использование памяти после удаления большого числа элементов из вектора. Это улучшает производительность и снижает потребление ресурсов, что особенно важно в средах с ограниченной памятью.
➡️ Библиотека PEGTL
PEGTL (Parsing Expression Grammar Template Library) — это библиотека для создания синтаксических анализаторов (парсеров) на C++. Она предоставляет мощные инструменты для определения грамматик и разбора текстов, что делает ее отличным выбором для создания языков программирования и обработки текстов.• PEGTL позволяет создавать сложные парсеры с минимальными усилиями, обеспечивая при этом высокую производительность и гибкость.
🔗 Ссылочка на доку
Почему я программирую на С/C++ (язык для профессионалов!)
Смотреть видео
Курс по созданию игр на движке Unreal Engine 5
Смотреть видео
Wt
Wt — это фреймворк веб-приложений, который позволяет разработчикам создавать веб-приложения с использованием C++. Его встроенные виджеты и компоненты позволяют легко создавать сложные веб-приложения с минимальными усилиями.
Кроме того, Wt предоставляет модель событий на стороне сервера, которая позволяет разработчикам писать веб-приложения, обладающие высокой отзывчивостью и интерактивностью.
https://www.webtoolkit.eu/wt
std::variant
Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке <variant>.
Шаблонный класс std::variant похож на упрощенную версию union, но с дополнительной безопасностью типов и поддержкой различных операций.
Основными функциями std::variant являются index(), valueless_by_exception(), operator=, emplace.
В этом примере мы создаем объект var, который может содержать значения типов int, float или std::string. Мы присваиваем var различные значения и получаем их с помощью std::get.
Однако если мы попытаемся получить значение, используя неправильный тип (например, std::get<int>(var), когда вариант содержит std::string), это вызовет исключение std::bad_variant_access.
Оператор присваивания ( = ), строго говоря, является бинарным оператором. Его объявление идентично объявлению любого другого бинарного оператора со следующими исключениями:
☑️ Он должен быть нестатической функцией-членом.
☑️ Он не наследуется производными классами.
☑️ Компилятор может создать функцию operator = по умолчанию для типов классов, если она не существует.
В примере показано, как объявить оператор присваивания.
«Прозрачный промоушн выгоден и разработчику, и его тимлиду». Нюансы карьеры разработчика на С++
https://habr.com/ru/companies/kaspersky/articles/729620/
#вопросы_с_собеседований
Бывает такое, что оператор new не выделяет память?
Ответ:
Да, бывает, когда new передаётся указатель на уже выделенную память (например, с помощью malloc). Это называется placement new. И оператор new без изменения возвращает второй параметр - указатель (void* operator new(std::size_t, void*)). Это используется для создания объектов в выделенном "хранилище" или после malloc.
Важно! В этом случае деструктор нужно вызывать самостоятельно!
⚡️ IT-обучение теперь в Telegram!
В cвязи с недавнем замедлением Ютуба — лучшие обучающие каналы переехали в Telegram
Вот каналы для айтишников:
👩💻 С/С++: @Cpp
⚙️ Backend: @Backend
📱 GitHub: @GitHub
👩💻 C#: @Csharp
🤓 Общее айти: @portalToIT
🖥 Базы Данных & SQL: @SQL
📱 Frontend: @Frontend
📱 Python: @Python
👩💻 Java: @Java
👩💻 Golang: @Golang
🖥 PHP: @PHP
👩💻 Моб. разработка: @MobDev
👩💻 Разработка игр: @GameDev
👩💻 DevOps: @DevOps
🖥 Data Science: @DataScience
🤔 Хакинг & ИБ: @InfoSec
🐞 Тестирование: @QA
📱 Маркетинг: @Marketing
🖥 Дизайн: @Design
➡️ Сохраняйте себе, чтобы не потерять