🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
std::enable_if
std::enable_if — это шаблон, который позволяет условно включать функциональность в зависимости от удовлетворения какого-либо условия.
Шаблон определен в заголовочном файле и позволяет "включить" код, если некое условие истинно, и "выключить", если ложно.
Часто используется для метапрограммирования — принятия решений на этапе компиляции, а также для перегрузки шаблонных функций.
В примере enable_if включит реализацию is_even только для целочисленных T. Для не целых типов компиляция завершится с ошибкой.
Таким образом, enable_if позволяет гибко управлять логикой и функциональностью на этапе компиляции.
#код
std::enable_if — это шаблон, который позволяет условно включать функциональность в зависимости от удовлетворения какого-либо условия.
Шаблон определен в заголовочном файле и позволяет "включить" код, если некое условие истинно, и "выключить", если ложно.
Часто используется для метапрограммирования — принятия решений на этапе компиляции, а также для перегрузки шаблонных функций.
В примере enable_if включит реализацию is_even только для целочисленных T. Для не целых типов компиляция завершится с ошибкой.
Таким образом, enable_if позволяет гибко управлять логикой и функциональностью на этапе компиляции.
#код
Что такое TDD?
TDD (Test-Driven Development) — это подход к разработке программного обеспечения, при котором сначала пишутся автоматические тесты, определяющие желаемое поведение кода, а затем реализуется минимально необходимый код, чтобы пройти эти тесты.
Основные принципы TDD:
— Написание теста перед кодом: сначала пишется тест, определяющий желаемую функциональность. Затем пишется минимальный код, чтобы пройти этот тест.
— Рефакторинг: после прохождения теста код рефакторится для улучшения структуры и читаемости, при этом все тесты должны оставаться пройденными.
— Повторение: цикл повторяется — новый тест, код, рефакторинг.
— Тесты должны быть автоматизированными и запускаться очень часто.
Преимущества TDD: предотвращение дефектов, улучшение структуры кода, быстрая обратная связь.
TDD позволяет создавать код, удовлетворяющий требованиям и хорошо тестируемый.
#вопросы_с_собеседований
TDD (Test-Driven Development) — это подход к разработке программного обеспечения, при котором сначала пишутся автоматические тесты, определяющие желаемое поведение кода, а затем реализуется минимально необходимый код, чтобы пройти эти тесты.
Основные принципы TDD:
— Написание теста перед кодом: сначала пишется тест, определяющий желаемую функциональность. Затем пишется минимальный код, чтобы пройти этот тест.
— Рефакторинг: после прохождения теста код рефакторится для улучшения структуры и читаемости, при этом все тесты должны оставаться пройденными.
— Повторение: цикл повторяется — новый тест, код, рефакторинг.
— Тесты должны быть автоматизированными и запускаться очень часто.
Преимущества TDD: предотвращение дефектов, улучшение структуры кода, быстрая обратная связь.
TDD позволяет создавать код, удовлетворяющий требованиям и хорошо тестируемый.
#вопросы_с_собеседований
is_sorted_until
Этот алгоритм проверяет, отсортирован ли заданный диапазон данных.
Он возвращает итератор на первый элемент, нарушающий порядок сортировки.
Алгоритм принимает 3 параметра:
— Итератор на начало проверяемого диапазона.
— Итератор на конец диапазона.
— Компаратор для сравнения элементов (по умолчанию less).
Алгоритм идет по диапазону от начала к концу и сравнивает каждый элемент с предыдущим с помощью компаратора.
Если нарушения порядка не найдено, возвращается итератор на конец диапазона. Иначе возвращается итератор на первый нарушающий элемент.
Этот алгоритм удобен, чтобы проверить, в какой момент отсортированный диапазон теряет порядок.
#код
Этот алгоритм проверяет, отсортирован ли заданный диапазон данных.
Он возвращает итератор на первый элемент, нарушающий порядок сортировки.
Алгоритм принимает 3 параметра:
— Итератор на начало проверяемого диапазона.
— Итератор на конец диапазона.
— Компаратор для сравнения элементов (по умолчанию less).
Алгоритм идет по диапазону от начала к концу и сравнивает каждый элемент с предыдущим с помощью компаратора.
Если нарушения порядка не найдено, возвращается итератор на конец диапазона. Иначе возвращается итератор на первый нарушающий элемент.
Этот алгоритм удобен, чтобы проверить, в какой момент отсортированный диапазон теряет порядок.
#код
🦾 Основы использования C/C++
С++ способен решать огромное количество задач и вся мощь этого языка в том, что он делает это быстро. Автор видео рассказывает, как исправить выполнение ненужных команд в отдельном ожидающем потоке, как эффективно использовать указатели на функции, а также много других полезных деталей.
Смотреть видео
С++ способен решать огромное количество задач и вся мощь этого языка в том, что он делает это быстро. Автор видео рассказывает, как исправить выполнение ненужных команд в отдельном ожидающем потоке, как эффективно использовать указатели на функции, а также много других полезных деталей.
Смотреть видео
Монитор с какой диагональю чаще всего используете на работе?
#интерактив
#интерактив
Ответьте на 3 вопроса, чтобы получить демо-доступ к курсу «Алгоритмы и структуры данных»
⚡️Получить демо, ответив на 3 вопроса – https://proglib.io/w/979a2896
В бесплатной части вас ждут:
1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов
2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ
3. Практические задания после лекций
4. Ссылки на дополнительные материалы для самостоятельного изучения
Переходите и начинайте учиться уже сегодня!
⚡️Получить демо, ответив на 3 вопроса – https://proglib.io/w/979a2896
В бесплатной части вас ждут:
1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов
2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ
3. Практические задания после лекций
4. Ссылки на дополнительные материалы для самостоятельного изучения
Переходите и начинайте учиться уже сегодня!
std::apply
std::apply — это функция, которая принимает в качестве аргументов вызываемый объект и кортеж аргументов, а затем вызывает этот объект с элементами кортежа в качестве аргументов. Это позволяет удобно вызывать функции с аргументами, хранящимися в кортеже.
В этом примере мы создаем кортеж args, содержащий два аргумента для функции add. Затем мы используем std::apply для вызова функции add с этими аргументами. В конце мы выводим результат на экран.
#код
std::apply — это функция, которая принимает в качестве аргументов вызываемый объект и кортеж аргументов, а затем вызывает этот объект с элементами кортежа в качестве аргументов. Это позволяет удобно вызывать функции с аргументами, хранящимися в кортеже.
В этом примере мы создаем кортеж args, содержащий два аргумента для функции add. Затем мы используем std::apply для вызова функции add с этими аргументами. В конце мы выводим результат на экран.
#код
Очередной #дайджест по С++:
✍️ C++23: четыре новых ассоциативных контейнера
В C++23 появились четыре новых ассоциативных контейнера: std::flat_map, std::flat_multimap, std::flat_set и std::flat_multiset, которые являются полноценной заменой упорядоченных ассоциативных контейнеров std::map, std::multimap, std::set и std::multiset.
✍️ Детекция машин на мобилке в 2023. С какими проблемами мы столкнулись и как решали
Как распознавали машины с камеры мобильного телефона с помощью TensorFlow-lite, C++, Qt и что из этого вышло.
✍️ Как и зачем мы парсим XML
Этот язык разметки настолько глубоко вошел в нашу жизнь, что сложно представить систему, в которой не используется он сам или его подмножества.
✍️ Опечатки, нулевые указатели и коварный таб: 33 фрагмента в библиотеке GTK
GTK – популярный фреймворк с открытым исходным кодом для создания графических интерфейсов.
✍️ C++23: четыре новых ассоциативных контейнера
В C++23 появились четыре новых ассоциативных контейнера: std::flat_map, std::flat_multimap, std::flat_set и std::flat_multiset, которые являются полноценной заменой упорядоченных ассоциативных контейнеров std::map, std::multimap, std::set и std::multiset.
✍️ Детекция машин на мобилке в 2023. С какими проблемами мы столкнулись и как решали
Как распознавали машины с камеры мобильного телефона с помощью TensorFlow-lite, C++, Qt и что из этого вышло.
✍️ Как и зачем мы парсим XML
Этот язык разметки настолько глубоко вошел в нашу жизнь, что сложно представить систему, в которой не используется он сам или его подмножества.
✍️ Опечатки, нулевые указатели и коварный таб: 33 фрагмента в библиотеке GTK
GTK – популярный фреймворк с открытым исходным кодом для создания графических интерфейсов.
Функция resize
Функция resize служит для изменения размера контейнеров, например вектора или deque.
Она динамически меняет количество элементов в контейнере на указанное число.
Например, для вектора numbers вызов:
numbers.resize(100);
Установит размер вектора в 100 элементов.
Если изначально элементов было меньше — новые будут инициализированы по умолчанию (нулями). Если было больше — лишние удалятся.
Также можно явно задать значение для инициализации:
numbers.resize(80, -1);
Также resize принимает вектор-шаблон для копирования значений при расширении.
#код
Функция resize служит для изменения размера контейнеров, например вектора или deque.
Она динамически меняет количество элементов в контейнере на указанное число.
Например, для вектора numbers вызов:
numbers.resize(100);
Установит размер вектора в 100 элементов.
Если изначально элементов было меньше — новые будут инициализированы по умолчанию (нулями). Если было больше — лишние удалятся.
Также можно явно задать значение для инициализации:
numbers.resize(80, -1);
Также resize принимает вектор-шаблон для копирования значений при расширении.
#код
CppCast: физические единицы и система величин
Гость подкаста рассказывает о своей библиотеке физических единиц (и величин) mp-units, о том, почему v2 представляет собой полностью измененный дизайн по сравнению с предыдущей версией и о том, насколько важно включение системы величин в этот новый дизайн.
Открыть сайт
Гость подкаста рассказывает о своей библиотеке физических единиц (и величин) mp-units, о том, почему v2 представляет собой полностью измененный дизайн по сравнению с предыдущей версией и о том, насколько важно включение системы величин в этот новый дизайн.
Открыть сайт
Алгоритм lexicographic_compare
Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле .
Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.
Работает для любых типов данных, которые можно сравнивать с помощью <.
#код
Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле .
Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.
Работает для любых типов данных, которые можно сравнивать с помощью <.
#код
Что такое специализация шаблона?
Специализация шаблона — это возможность создать отдельную реализацию шаблонной функции или класса для конкретных типов параметров. Это позволяет оптимизировать шаблонные решения для частных случаев.
Например, можно создать специализацию std::vector для bool, которая будет хранить данные в битовых полях, а не как отдельные элементы.
При вызове шаблона компилятор будет искать специализацию для конкретных типов и использовать ее, если она есть. В противном случае используется обобщенная реализация.
#вопросы_с_собеседований
Специализация шаблона — это возможность создать отдельную реализацию шаблонной функции или класса для конкретных типов параметров. Это позволяет оптимизировать шаблонные решения для частных случаев.
Например, можно создать специализацию std::vector для bool, которая будет хранить данные в битовых полях, а не как отдельные элементы.
При вызове шаблона компилятор будет искать специализацию для конкретных типов и использовать ее, если она есть. В противном случае используется обобщенная реализация.
#вопросы_с_собеседований
std::pair
std::pair — это шаблон класса из стандартной библиотеки, который инкапсулирует пару значений разных типов.
Он часто используется для возврата нескольких значений из функции.
В этом примере getStats возвращает пару значений — сумму и среднее элементов массива. С помощью std::pair эти значения упаковываются в один возвращаемый объект. В main используется structured binding для распаковки пары в переменные sum и avg.
#код
std::pair — это шаблон класса из стандартной библиотеки, который инкапсулирует пару значений разных типов.
Он часто используется для возврата нескольких значений из функции.
В этом примере getStats возвращает пару значений — сумму и среднее элементов массива. С помощью std::pair эти значения упаковываются в один возвращаемый объект. В main используется structured binding для распаковки пары в переменные sum и avg.
#код
Не используйте атрибуты [[likely]] или [[unlikely]].
В C++20 появились атрибуты [[likely]] и [[unlikely]] как способ дать программисту подсказку по оптимизации своей реализации. Почему же это не стоит использовать?
Читать статью
В C++20 появились атрибуты [[likely]] и [[unlikely]] как способ дать программисту подсказку по оптимизации своей реализации. Почему же это не стоит использовать?
Читать статью
Очередной #дайджест по С++:
✍️ Backend Driven UI с точки зрения бэкенда: к чему готовиться, если вы решили на него перейти
Многим знаком подход Backend Driven UI. С его помощью можно создавать новые страницы, запускать А/B-тесты, легко менять флоу в любое время и сразу на всех платформах. И при этом не надо долго и мучительно перевыкатывать приложение.
✍️ C# делегаты изнутри. Можно ли расширить С++ стандарт для поддержки делегатов в стиле C#
Чисто техническая статья, рассматривается тема, которая заявлена в заголовке, плюс разные практические методы, которые в этом будут полезны.
✍️ import CMake; Эксперимент окончен!
Наконец эксперимент завершен, и в CMake 3.28 включена официальная поддержка именованных модулей C++20 без необходимости установки переменной CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API.
✍️ Как использовать std::span из C++20
В этой статье рассмотрен std::span, который является более универсальным, чем string_view, и может помочь в работе с произвольными смежными коллекциями.
✍️ Backend Driven UI с точки зрения бэкенда: к чему готовиться, если вы решили на него перейти
Многим знаком подход Backend Driven UI. С его помощью можно создавать новые страницы, запускать А/B-тесты, легко менять флоу в любое время и сразу на всех платформах. И при этом не надо долго и мучительно перевыкатывать приложение.
✍️ C# делегаты изнутри. Можно ли расширить С++ стандарт для поддержки делегатов в стиле C#
Чисто техническая статья, рассматривается тема, которая заявлена в заголовке, плюс разные практические методы, которые в этом будут полезны.
✍️ import CMake; Эксперимент окончен!
Наконец эксперимент завершен, и в CMake 3.28 включена официальная поддержка именованных модулей C++20 без необходимости установки переменной CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API.
✍️ Как использовать std::span из C++20
В этой статье рассмотрен std::span, который является более универсальным, чем string_view, и может помочь в работе с произвольными смежными коллекциями.
Как часто вы ездите в офис? Сколько раз в неделю?
#интерактив
#интерактив
for-each циклы
Цикл for-each — это удобный способ перебрать все элементы контейнера (массива, вектора и т. д.). Синтаксис:
for (type element : container) {
// тело цикла
}
Цикл последовательно проходит по всем элементам контейнера и записывает каждый в переменную element.
#код
Цикл for-each — это удобный способ перебрать все элементы контейнера (массива, вектора и т. д.). Синтаксис:
for (type element : container) {
// тело цикла
}
Цикл последовательно проходит по всем элементам контейнера и записывает каждый в переменную element.
#код
Что такое internal linkage?
internal linkage (внутреннее связывание) означает, что имя (например, переменная или функция) видимо и доступно только в пределах файла (или, точнее, в пределах трансляционной единицы), в котором оно определено. Это означает, что если у вас есть два разных файла с исходным кодом, и в каждом из них определено имя с внутренней связью, то эти два имени считаются разными и не конфликтуют друг с другом.
Внутреннюю связь в C++ можно установить несколькими способами. Например, если вы определите переменную или функцию как static, она будет иметь внутреннюю связь. Также, имена в безымянных пространствах имен (anonymous namespaces) имеют внутреннюю связь.
#вопросы_с_собеседований
internal linkage (внутреннее связывание) означает, что имя (например, переменная или функция) видимо и доступно только в пределах файла (или, точнее, в пределах трансляционной единицы), в котором оно определено. Это означает, что если у вас есть два разных файла с исходным кодом, и в каждом из них определено имя с внутренней связью, то эти два имени считаются разными и не конфликтуют друг с другом.
Внутреннюю связь в C++ можно установить несколькими способами. Например, если вы определите переменную или функцию как static, она будет иметь внутреннюю связь. Также, имена в безымянных пространствах имен (anonymous namespaces) имеют внутреннюю связь.
#вопросы_с_собеседований
requires clause
requires clause в С++20 — это новый синтаксис для задания требований к шаблонам, альтернативный requires-выражениям.
requires clause позволяет задавать требования к типам непосредственно при объявлении шаблона. Это делает код более читабельным и понятным.
Requires clause применяется для:
— Проверки наличия определенных возможностей у типов-параметров шаблонов.
— Ограничения допустимых типов-параметров.
— Условного компилирования шаблонов в зависимости от типов.
В примере requires clause гарантирует, что функция add будет работать только с целочисленными типами.
Это делает намерения программиста явными и позволяет лучше контролировать вызовы шаблона.
#код
requires clause в С++20 — это новый синтаксис для задания требований к шаблонам, альтернативный requires-выражениям.
requires clause позволяет задавать требования к типам непосредственно при объявлении шаблона. Это делает код более читабельным и понятным.
Requires clause применяется для:
— Проверки наличия определенных возможностей у типов-параметров шаблонов.
— Ограничения допустимых типов-параметров.
— Условного компилирования шаблонов в зависимости от типов.
В примере requires clause гарантирует, что функция add будет работать только с целочисленными типами.
Это делает намерения программиста явными и позволяет лучше контролировать вызовы шаблона.
#код
Как избежать deadlock
Deadlock (взаимная блокировка) возникает, когда два или более потока заблокированы в ожидании ресурса, который удерживается другим потоком.
Чтобы избежать deadlock, нужно следовать следующим правилам:
— Не блокировать ресурсы в разном порядке в разных потоках.
— Не удерживать блокировку во время выполнения долгих операций.
— Использовать lock_guard или unique_lock вместо явных lock/unlock.
— Избегать вложенных блокировок одного и того же мьютекса.
— Применять порядок блокировки ресурсов, например, всегда в алфавитном порядке.
— Использовать мьютексы только для защиты данных, а не для управления логикой.
Соблюдая эти правила, можно предотвратить ситуации взаимной блокировки потоков и построить корректную многопоточную логику.
#код
Deadlock (взаимная блокировка) возникает, когда два или более потока заблокированы в ожидании ресурса, который удерживается другим потоком.
Чтобы избежать deadlock, нужно следовать следующим правилам:
— Не блокировать ресурсы в разном порядке в разных потоках.
— Не удерживать блокировку во время выполнения долгих операций.
— Использовать lock_guard или unique_lock вместо явных lock/unlock.
— Избегать вложенных блокировок одного и того же мьютекса.
— Применять порядок блокировки ресурсов, например, всегда в алфавитном порядке.
— Использовать мьютексы только для защиты данных, а не для управления логикой.
Соблюдая эти правила, можно предотвратить ситуации взаимной блокировки потоков и построить корректную многопоточную логику.
#код