➡️ Путь к утонченности: применение диапазонных циклов
• Диапазонные циклы (range-based for loop) предоставляют удобный и изящный способ проходить по элементам контейнеров. Эта конструкция делает код короче и понятнее.
• Диапазонные циклы помогают избежать повторения кода и уменьшают количество шаблонного кода, благодаря чему они становятся более лаконичными и удобными для восприятия.
• Синтаксис диапазонных циклов прост и легко запоминается, что делает их отличным выбором для обхода элементов контейнеров.
• Диапазонные циклы обеспечивают безопасное прохождение по контейнерам, предотвращая выход за границы и другие ошибки.
👩💻
@quizcpp
• Диапазонные циклы (range-based for loop) предоставляют удобный и изящный способ проходить по элементам контейнеров. Эта конструкция делает код короче и понятнее.
• Диапазонные циклы помогают избежать повторения кода и уменьшают количество шаблонного кода, благодаря чему они становятся более лаконичными и удобными для восприятия.
• Синтаксис диапазонных циклов прост и легко запоминается, что делает их отличным выбором для обхода элементов контейнеров.
• Диапазонные циклы обеспечивают безопасное прохождение по контейнерам, предотвращая выход за границы и другие ошибки.
👩💻
@quizcpp
➡️ Пользовательские литералы
• В основном это могут быть реальные единицы измерения, такие как kb, mb, км, см, рубли, доллары, евро и так далее. Пользовательские литералы дают возможность не создавать функции для преобразования единиц во время выполнения, а работать с ними как с другими примитивными типами.
• Это очень удобно для работы с единицами и измерениями.
• С помощью добавления constexpr можно обеспечить отсутствие влияния на производительность во время выполнения.
👩💻
@quizcpp
• В основном это могут быть реальные единицы измерения, такие как kb, mb, км, см, рубли, доллары, евро и так далее. Пользовательские литералы дают возможность не создавать функции для преобразования единиц во время выполнения, а работать с ними как с другими примитивными типами.
• Это очень удобно для работы с единицами и измерениями.
• С помощью добавления constexpr можно обеспечить отсутствие влияния на производительность во время выполнения.
👩💻
@quizcpp
➡️ Концепты (Concepts) в C++
Концепты - это новая возможность в C++20, которая позволяет задавать ограничения на шаблонные параметры. Это позволяет писать более безопасный и читаемый код, поскольку компилятор проверяет соответствие типов требованиям концептов на этапе компиляции.
• template concept Arithmetic = std::is_arithmetic_v; определяет концепт Arithmetic, который ограничивает типы, для которых значение std::is_arithmetic_v истинно (т.е. типы, которые являются арифметическими).
• template T add(const T& a, const T& b) определяет шаблонную функцию add, которая будет компилироваться только для типов, удовлетворяющих концепту Arithmetic.
Использование функции add:
• Примеры с целыми числами и числами с плавающей запятой успешно вызывают функцию add.
• Пример со строками (закомментированный) вызовет ошибку компиляции, так как std::string не является арифметическим типом.
👩💻
@quizcpp
Концепты - это новая возможность в C++20, которая позволяет задавать ограничения на шаблонные параметры. Это позволяет писать более безопасный и читаемый код, поскольку компилятор проверяет соответствие типов требованиям концептов на этапе компиляции.
• template concept Arithmetic = std::is_arithmetic_v; определяет концепт Arithmetic, который ограничивает типы, для которых значение std::is_arithmetic_v истинно (т.е. типы, которые являются арифметическими).
• template T add(const T& a, const T& b) определяет шаблонную функцию add, которая будет компилироваться только для типов, удовлетворяющих концепту Arithmetic.
Использование функции add:
• Примеры с целыми числами и числами с плавающей запятой успешно вызывают функцию add.
• Пример со строками (закомментированный) вызовет ошибку компиляции, так как std::string не является арифметическим типом.
👩💻
@quizcpp
➡️ Строго типизированные перечисления
• Типобезопасные перечисления, которые решают множество проблем с C-перечислениями, включая неявные преобразования, арифметические операции, невозможность указать базовый тип, загрязнение области видимости и т.д.
👩💻
@quizcpp
• Типобезопасные перечисления, которые решают множество проблем с C-перечислениями, включая неявные преобразования, арифметические операции, невозможность указать базовый тип, загрязнение области видимости и т.д.
👩💻
@quizcpp
➡️ Наследование с помощью private и public
• Использование private и public при наследовании в C++ позволяет контролировать доступ к членам базового класса в производных классах.
• Это может быть полезно для сокрытия частей реализации базового класса от внешнего мира или ограничения доступа к членам в иерархии классов.
• Эта фишка особенно полезна при проектировании классов и их взаимодействия, позволяя более гибко управлять доступом к данным и методам в рамках наследования.
👩💻
@quizcpp
• Использование private и public при наследовании в C++ позволяет контролировать доступ к членам базового класса в производных классах.
• Это может быть полезно для сокрытия частей реализации базового класса от внешнего мира или ограничения доступа к членам в иерархии классов.
• Эта фишка особенно полезна при проектировании классов и их взаимодействия, позволяя более гибко управлять доступом к данным и методам в рамках наследования.
👩💻
@quizcpp
➡️ Как включить все стандартные библиотеки одной командой
Чтобы разом включить в проект все стандартные библиотеки, используйте #include . Это особенно полезно в условиях дефицита времени на соревнованиях по программированию.
• Например, вы можете заменить этот фрагмент (и многие другие):
#include
#include
#include
#include
#include
#include
#include
#include
• Простой строкой:
#include
👩💻
@quizcpp
Чтобы разом включить в проект все стандартные библиотеки, используйте #include . Это особенно полезно в условиях дефицита времени на соревнованиях по программированию.
• Например, вы можете заменить этот фрагмент (и многие другие):
#include
#include
#include
#include
#include
#include
#include
#include
• Простой строкой:
#include
👩💻
@quizcpp
➡️ Оптимизация Производительности с Помощью std::any
std::any в C++17 предоставляет мощный и гибкий инструмент для хранения и управления значениями любого типа. Он упрощает работу с разнородными данными, улучшает читаемость кода и повышает безопасность за счет проверки типов во время выполнения.
• Гибкость: Позволяет хранить значения любых типов без необходимости создания общих базовых классов или использования void*.
• Безопасность: std::any обеспечивает безопасное извлечение значения с проверкой типов с помощью std::any_cast.
• Читаемость: Улучшает читаемость и поддерживаемость кода за счет отказа от низкоуровневых трюков.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
std::any в C++17 предоставляет мощный и гибкий инструмент для хранения и управления значениями любого типа. Он упрощает работу с разнородными данными, улучшает читаемость кода и повышает безопасность за счет проверки типов во время выполнения.
• Гибкость: Позволяет хранить значения любых типов без необходимости создания общих базовых классов или использования void*.
• Безопасность: std::any обеспечивает безопасное извлечение значения с проверкой типов с помощью std::any_cast.
• Читаемость: Улучшает читаемость и поддерживаемость кода за счет отказа от низкоуровневых трюков.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Как получить карьерный буст и MacBook за подписку
В интернете полно курсов по самопиару и карьерному развитию в IT, но все они не сравнятся с реальными кейсами от действующих практиков.
Не нужно покупать дорогие консультации, чтобы перенять чужой опыт — достаточно подписаться на папку, где собралось более 30 лучших экспертов из IT и digital
Это люди, которые не только построили успешную карьеру с нуля, но и основали собственные компании.
Они собрались, чтобы прокачать тебя в маркетинге и дизайне, а ещё провести розыгрыш.
Подпишись на них и получи один из 3 призов:
🥇 Главный приз — MacBook Air (M2)
🥈 2 место: Яндекс Станция Лайт 2
🥉 3 место: Наушники HUAWEI Freebuds 5i
Участвуешь?
1. Подпишись на папку
2. Подтверди участие в боте
19 июня в прямом эфире опубликуем итоги розыгрыша!
В интернете полно курсов по самопиару и карьерному развитию в IT, но все они не сравнятся с реальными кейсами от действующих практиков.
Не нужно покупать дорогие консультации, чтобы перенять чужой опыт — достаточно подписаться на папку, где собралось более 30 лучших экспертов из IT и digital
Это люди, которые не только построили успешную карьеру с нуля, но и основали собственные компании.
Они собрались, чтобы прокачать тебя в маркетинге и дизайне, а ещё провести розыгрыш.
Подпишись на них и получи один из 3 призов:
Участвуешь?
1. Подпишись на папку
2. Подтверди участие в боте
19 июня в прямом эфире опубликуем итоги розыгрыша!
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ V8
• Если вам нужен удобный инструмент для работы с JavaScript, V8 отлично подойдёт.
• V8 использует классы на C++ в namespace V8, что позволяет работать с JavaScript через привычную оболочку C++. Объекты C++ и V8 взаимодействуют через v8::Handle (template-классы).
• Установка V8 занимает немного времени и очень полезна для работы с JavaScript. Кроме того, знания о библиотеках, связывающих C++ и JavaScript, часто спрашивают на собеседованиях, поэтому стоит с ними познакомиться даже если вы не планируете работать с JavaScript.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
• Если вам нужен удобный инструмент для работы с JavaScript, V8 отлично подойдёт.
• V8 использует классы на C++ в namespace V8, что позволяет работать с JavaScript через привычную оболочку C++. Объекты C++ и V8 взаимодействуют через v8::Handle (template-классы).
• Установка V8 занимает немного времени и очень полезна для работы с JavaScript. Кроме того, знания о библиотеках, связывающих C++ и JavaScript, часто спрашивают на собеседованиях, поэтому стоит с ними познакомиться даже если вы не планируете работать с JavaScript.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Active Template Library
ATL (Active Template Library) — это библиотека шаблонов C++ с открытым исходным кодом, созданная для упрощения программирования объектов COM.
• Поддерживает функции COM, такие как стандартные реализации, двойные интерфейсы и ActiveX-контролы.
• Разработана Microsoft как замена MFC для COM-объектов, используя шаблон CRTP.
🔗 Ссылочка на доку (https://learn.microsoft.com/en-us/cpp/atl/active-template-library-atl-concepts?view=msvc-170&viewFallbackFrom=vs-2019)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
ATL (Active Template Library) — это библиотека шаблонов C++ с открытым исходным кодом, созданная для упрощения программирования объектов COM.
• Поддерживает функции COM, такие как стандартные реализации, двойные интерфейсы и ActiveX-контролы.
• Разработана Microsoft как замена MFC для COM-объектов, используя шаблон CRTP.
🔗 Ссылочка на доку (https://learn.microsoft.com/en-us/cpp/atl/active-template-library-atl-concepts?view=msvc-170&viewFallbackFrom=vs-2019)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ oneTBB
oneTBB (oneAPI Threading Building Blocks) — это библиотека на C++ для упрощения добавления параллелизма в сложные приложения.
• Гибкость: облегчает написание параллельных программ на C++.
• Многопоточность: не нужно быть экспертом по потокам для использования.
• Функции: предоставляет набор функций, классов и интерфейсов для параллелизации и масштабирования кода.
• Совместимость: работает с другими библиотеками потоков.
• Программирование: ориентирована на масштабируемое и параллельное программирование, а не просто на потоки.
🔗 Ссылочка на доку (https://github.com/oneapi-src/oneTBB)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
oneTBB (oneAPI Threading Building Blocks) — это библиотека на C++ для упрощения добавления параллелизма в сложные приложения.
• Гибкость: облегчает написание параллельных программ на C++.
• Многопоточность: не нужно быть экспертом по потокам для использования.
• Функции: предоставляет набор функций, классов и интерфейсов для параллелизации и масштабирования кода.
• Совместимость: работает с другими библиотеками потоков.
• Программирование: ориентирована на масштабируемое и параллельное программирование, а не просто на потоки.
🔗 Ссылочка на доку (https://github.com/oneapi-src/oneTBB)
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Эффективное использование std::tuple для группировки возвращаемых значений в C++
Использование std::tuple позволяет легко возвращать и обрабатывать несколько значений из функции без необходимости создания дополнительных структур.
Использование std::tuple позволяет улучшить читаемость и упростить код, когда нужно возвращать несколько значений из функции.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Использование std::tuple позволяет легко возвращать и обрабатывать несколько значений из функции без необходимости создания дополнительных структур.
Использование std::tuple позволяет улучшить читаемость и упростить код, когда нужно возвращать несколько значений из функции.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Индексирование массива (Оператор подиндексации) является коммутативным
Индексирование массива — обычная операция для всех программистов и в целом одинаково во всех языках программирования. Однако в C++ вы можете поменять местами массив и индекс, получая такой код:
int arr[] = {1, 2, 3, 4};
std::cout
@quizcpp
Индексирование массива — обычная операция для всех программистов и в целом одинаково во всех языках программирования. Однако в C++ вы можете поменять местами массив и индекс, получая такой код:
int arr[] = {1, 2, 3, 4};
std::cout
@quizcpp
➡️ Собственный new для класса
Оператор new в классе Widget должен работать так:
• Установить глобальный обработчик для new через set_new_handler, указав функцию из класса Widget.
• Вызвать глобальный operator new. Если он не справится, сработает обработчик Widget.
• Если и это не поможет, глобальный new выбросит исключение. В этом случае обработчик Widget должен восстановить исходный обработчик и передать исключение дальше.
• Если память выделена успешно, вернуть указатель и восстановить предыдущий обработчик new.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Оператор new в классе Widget должен работать так:
• Установить глобальный обработчик для new через set_new_handler, указав функцию из класса Widget.
• Вызвать глобальный operator new. Если он не справится, сработает обработчик Widget.
• Если и это не поможет, глобальный new выбросит исключение. В этом случае обработчик Widget должен восстановить исходный обработчик и передать исключение дальше.
• Если память выделена успешно, вернуть указатель и восстановить предыдущий обработчик new.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Правильный менеджер памяти
• Создать эффективный менеджер памяти сложно из-за множества нюансов.
• Часто игнорируются переносимость, выравнивание и безопасность.
• Рассмотрите готовые решения, такие как коммерческие продукты или open source проекты, например, библиотеку Pool из Boost.
• Современные компиляторы могут отлаживать функции управления памятью.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
• Создать эффективный менеджер памяти сложно из-за множества нюансов.
• Часто игнорируются переносимость, выравнивание и безопасность.
• Рассмотрите готовые решения, такие как коммерческие продукты или open source проекты, например, библиотеку Pool из Boost.
• Современные компиляторы могут отлаживать функции управления памятью.
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Любителям x86-64 assembler посвящается: DIY волокна в C++
Смотреть статью ()
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
https://habr.com/ru/articles/908406/
Смотреть статью ()
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
https://habr.com/ru/articles/908406/
➡️ Инициализация и присваивание
Между инициализацией и присваиванием есть тонкая разница.
• Инициализация означает присвоение значения переменной в момент её создания, а присваивание относится к изменению значения переменной на другое.
// Это инициализация. Хорошая практика —
// инициализировать переменную сразу при её создании.
int i = 0;
// Это присваивание, где начальное значение
// заменяется новым.
i = 10;
• В C++11 переменную можно инициализировать несколькими способами:
int i = {0};
int i{0};
int i(0);
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Между инициализацией и присваиванием есть тонкая разница.
• Инициализация означает присвоение значения переменной в момент её создания, а присваивание относится к изменению значения переменной на другое.
// Это инициализация. Хорошая практика —
// инициализировать переменную сразу при её создании.
int i = 0;
// Это присваивание, где начальное значение
// заменяется новым.
i = 10;
• В C++11 переменную можно инициализировать несколькими способами:
int i = {0};
int i{0};
int i(0);
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Разделяемые блокировки
Разделяемые блокировки полезны, когда:
• Блокировка удерживается долго.
• Несколько читателей могут одновременно её захватывать.
Схема разделяемой блокировки может быть эффективной, если:
• Блокировка удерживается длительное время, например, при работе с большим контейнером.
Основной вопрос:
• Не "пишу ли я в данные", а "как долго блокировка будет удерживаться читателями по сравнению с временем её захвата?"
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
Разделяемые блокировки полезны, когда:
• Блокировка удерживается долго.
• Несколько читателей могут одновременно её захватывать.
Схема разделяемой блокировки может быть эффективной, если:
• Блокировка удерживается длительное время, например, при работе с большим контейнером.
Основной вопрос:
• Не "пишу ли я в данные", а "как долго блокировка будет удерживаться читателями по сравнению с временем её захвата?"
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
➡️ Утверждение Валидности
Утверждения помогают проверять корректность выражений с помощью макроса assert из заголовочного файла . Это полезно для отладки, чтобы проверить правильность значения переменной.
Если выражение равно 0 (ложь), выводится сообщение об ошибке, и программа завершается.
🗣️ Например, переменная maxsize никогда не должна превышать 1024. Можно использовать утверждение для проверки значения и вывода сообщения об ошибке, если значение некорректно.
#include
int main() {
assert(maxsize
@quizcpp
Утверждения помогают проверять корректность выражений с помощью макроса assert из заголовочного файла . Это полезно для отладки, чтобы проверить правильность значения переменной.
Если выражение равно 0 (ложь), выводится сообщение об ошибке, и программа завершается.
🗣️ Например, переменная maxsize никогда не должна превышать 1024. Можно использовать утверждение для проверки значения и вывода сообщения об ошибке, если значение некорректно.
#include
int main() {
assert(maxsize
@quizcpp
Оптимизируем C++ шаблоны: от инлайнинга до модулей
Смотреть статью ()
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
https://habr.com/ru/articles/914632/
Смотреть статью ()
(https://www.tgoop.com/Learning_pluses) 👩💻
@quizcpp
https://habr.com/ru/articles/914632/