uk
Feedback
C++ geek

C++ geek

Відкрити в Telegram

Учим C/C++ на примерах

Показати більше
3 611
Підписники
Немає даних24 години
-17 днів
-3830 день
Архів дописів
Вызов функции через кортеж Креативное применение шаблонов, которое позволяет вызвать любую функцию, передав в неё параметры в
Вызов функции через кортеж Креативное применение шаблонов, которое позволяет вызвать любую функцию, передав в неё параметры в виде кортежа. ➡️ @cpp_geek

Избавляемся от макросов В целом, разработчики стандарта стараются исключить препроцессор. Как следствие, в новой версии можно
Избавляемся от макросов В целом, разработчики стандарта стараются исключить препроцессор. Как следствие, в новой версии можно не пользоваться макросами FILE и LINE, а взамен использовать std::source_location(см картинку). Как мы видим, код становится более единообразным, в одном стиле, с расширяемым функционалом. ➡️ @cpp_geek

Проверка возможности конструирования элемента с набором конкретных параметров Когда шаблонный класс задан в виде template, бы
Проверка возможности конструирования элемента с набором конкретных параметров Когда шаблонный класс задан в виде template<class T, typename... Args>, бывает трудно понять, какие аргументы можно использовать. Метод is_constructible из библиотеки type_traits даёт неполный ответ: он показывает, существует ли конструктор под конкретные аргументы. Для более полной картины можно использовать еще один шаблон. ➡️ @cpp_geek

malloc стал безопасен В предыдущих версиях использование низкоуровневых функций, унаследованных из языка Си, не рекомендовало
malloc стал безопасен В предыдущих версиях использование низкоуровневых функций, унаследованных из языка Си, не рекомендовалось. Проблема в том, что Си оперирует байтами, а в С++ происходит работа с объектами со своим временем жизни и областью видимости. До С++ 20 время жизни объекта начиналось после вызова оператора new. В новой версии все изменилось — принято считать, что набор низкоуровневых функций — memcpy, memmove, malloc, aligned_alloc, calloc, realloc, bit_cast, начинает время жизни объекта. Т. е. следующий код(см картинку) будет валиден. Т. е. у нас появляется обратная совместимость с языком Си, но относительно С++ в новой трактовке. ➡️ @cpp_geek

Проверка специализации типа Иногда встает задача проверить, является ли конкретный тип данных специализацией определенного ша
Проверка специализации типа Иногда встает задача проверить, является ли конкретный тип данных специализацией определенного шаблона. Для этого можно использовать синтаксис шаблонов template. ➡️ @cpp_geek

Строковые литералы как параметры шаблона Начиная с C ++ 20, вы можете использовать строку в качестве параметра шаблона, не яв
Строковые литералы как параметры шаблона Начиная с C ++ 20, вы можете использовать строку в качестве параметра шаблона, не являющегося типом. Идея состоит в том, чтобы использовать стандартную строку basic_fixed_string, которая имеет конструктор constexpr. Конструктор constexpr позволяет ему создать экземпляр фиксированной строки во время компиляции. Вроде бы мелочь, а приятно — не нужно производить обходных маневров и использовать лишнюю память. ➡️ @cpp_geek

Встроенные алгоритмы Удобно использовать встроенные функции all_of, any_of и none_of для быстрой проверки элементов коллекции
Встроенные алгоритмы Удобно использовать встроенные функции all_of, any_of и none_of для быстрой проверки элементов коллекции на соответствие условию. ➡️ @cpp_geek

Новые атрибуты [[likely]] и[[unlikely]] В C++20 мы получаем новые атрибуты [[likely]] и [[unlikely]], которые позволяют подск
Новые атрибуты [[likely]] и[[unlikely]] В C++20 мы получаем новые атрибуты [[likely]] и [[unlikely]], которые позволяют подсказывать оптимизатору, является ли путь выполнения более или менее вероятным. ➡️ @cpp_geek

Трюки с логарифмом Функцию log тоже можно использовать для ряда изящных решений. ➡️ @cpp_geek
Трюки с логарифмом Функцию log тоже можно использовать для ряда изящных решений. ➡️ @cpp_geek

Упрощаем дебаг Определите оператор &lt;&lt; для структур STL, чтобы упростить добавление отладочных выходов в ваш код. Это лу
Упрощаем дебаг Определите оператор << для структур STL, чтобы упростить добавление отладочных выходов в ваш код. Это лучше, чем стандартные функции вывода. Также определите соответствующий макрос. ➡️ @cpp_geek

Сложный расчет констант Использование констант – хороший тон. Это позволяет компилятору лучше оптимизировать код и делает его
Сложный расчет констант Использование констант – хороший тон. Это позволяет компилятору лучше оптимизировать код и делает его более явным. Но если вычисление слишком громоздкое, от модификатора const приходится отказываться. На помощь приходят лямбда-функции. ➡️ @cpp_geek

Бинарный поиск Чаще всего бинарный поиск (бинпоиск) используют, чтобы найти элемент в отсортированном массиве. Мы начинаем ис
Бинарный поиск Чаще всего бинарный поиск (бинпоиск) используют, чтобы найти элемент в отсортированном массиве. Мы начинаем искать с середины массива. Если находим то, что нужно, или если больше нечего рассматривать, мы останавливаемся. В противном случае мы решаем, в каком направлении — вправо или влево от середины — мы должны продолжить поиск. Так как пространство поиска после каждой проверки делится на два, то время выполнения алгоритма — O(log n). ➡️ @cpp_geek

Представления (Views) Представления — это просто-напросто диапазоны, которые дешево копировать и перемещать (за константное в
Представления (Views) Представления — это просто-напросто диапазоны, которые дешево копировать и перемещать (за константное время). Из-за этого представление не может владеть элементами, которые просматривает. Одно исключение — std::views::single, которому принадлежит единственный просматриваемый элемент. Представления компонуются во время компиляции с прицелом на то, что компилятор заинлайнит код. Например, следующий код последние последние три элемента диапазона. Сначала мы reverse’им диапазон, затем берем первые три элемента и, наконец, снова reverse’им диапазон (обратите внимание, что существует std::views::drop, который делает это напрямую). ➡️ @cpp_geek

Алгоритм iota Присваивает каждому элементу в диапазоне [first,last) последовательные значения val, как если бы они увеличивал
Алгоритм iota Присваивает каждому элементу в диапазоне [first,last) последовательные значения val, как если бы они увеличивались ++val после записи каждого элемента. ➡️ @cpp_geek

Строго-типизированный enum У «традиционных» перечислений в С++ есть некоторые недостатки: они экспортируют свои значения в ок
Строго-типизированный enum У «традиционных» перечислений в С++ есть некоторые недостатки: они экспортируют свои значения в окружающую область видимости (что может привести к конфликту имен), они неявно преобразовываются в целый тип и не могут иметь определенный пользователем тип. Эти проблемы устранены в С++11 с введением новой категории перечислений, названных strongly-typed enums. Они определяются ключевым словом enum class. Они больше не экспортируют свои перечисляемые значения в окружающую область видимости, больше не преобразуются неявно в целый тип и могут иметь определенный пользователем тип (эта опция так же добавлена и для «традиционных» перечислений). ➡️ @cpp_geek

Алгоритм copy_n Используется для копирования элементов из одного контейнера в другой. ➡️ @cpp_geek
Алгоритм copy_n Используется для копирования элементов из одного контейнера в другой. ➡️ @cpp_geek

range-based циклы В С++11 была добавлена поддержка парадигмы for each для итерации по набору. В новой форме возможно выполнят
range-based циклы В С++11 была добавлена поддержка парадигмы for each для итерации по набору. В новой форме возможно выполнять итерации в случае, если для объекта итерации перегружены методы begin() и end(). Это полезно, когда вы просто хотите получить элементы массива/контейнера или сделать с ними что-то, не заботясь об индексах, итераторах или кол-ве элементов. ➡️ @cpp_geek

Является ли число степенью двойки Мы можем проверить, является ли число степенью двойки или нет напрямую, используя код выше.
Является ли число степенью двойки Мы можем проверить, является ли число степенью двойки или нет напрямую, используя код выше. ➡️ @cpp_geek

nullptr Раньше для обнуления указателей использовался макрос NULL, являющийся нулем — целым типом, что, естественно, вызывало
nullptr Раньше для обнуления указателей использовался макрос NULL, являющийся нулем — целым типом, что, естественно, вызывало проблемы (например, при перегрузке функций). Ключевое слово nullptr имеет свой собственный тип std::nullptr_t, что избавляет нас от бывших проблем. Существуют неявные преобразования nullptr к нулевому указателю любого типа и к bool (как false), но преобразования к целочисленных типам нет. ➡️ @cpp_geek

Ссылки в C++ Когда переменная объявляется как ссылка, она становится альтернативным именем для существующей переменной. Перем
Ссылки в C++ Когда переменная объявляется как ссылка, она становится альтернативным именем для существующей переменной. Переменную можно объявить как ссылку, поместив в её объявление "&". ➡️ @cpp_geek