Библиотека C/C++ разработчика | cpp, boost, qt
20.3K subscribers
1.78K photos
47 videos
16 files
3.97K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
加入频道
std::reference_wrapper

std::reference_wrapper — это класс в C++, предоставляемый стандартной библиотекой, который оборачивает ссылку на объект. Этот класс полезен, когда вам нужно передать или хранить ссылку на объект, но вы хотите избежать неявного копирования объекта.

Основное назначение std::reference_wrapper заключается в том, чтобы позволить передавать ссылки как аргументы функций, которые обычно ожидают копии объектов. Это особенно полезно, например, при использовании алгоритмов из стандартной библиотеки, которые могут копировать элементы контейнера, если не явно указано иначе.
#код
👍16
std::enable_if

std::enable_if — это шаблон, который позволяет условно включать функциональность в зависимости от удовлетворения какого-либо условия.
Шаблон определен в заголовочном файле и позволяет "включить" код, если некое условие истинно, и "выключить", если ложно.

Часто используется для метапрограммирования — принятия решений на этапе компиляции, а также для перегрузки шаблонных функций.

В примере enable_if включит реализацию is_even только для целочисленных T. Для не целых типов компиляция завершится с ошибкой.
Таким образом, enable_if позволяет гибко управлять логикой и функциональностью на этапе компиляции.
#код
👍16
is_sorted_until

Этот алгоритм проверяет, отсортирован ли заданный диапазон данных.
Он возвращает итератор на первый элемент, нарушающий порядок сортировки.

Алгоритм принимает 3 параметра:
— Итератор на начало проверяемого диапазона.
— Итератор на конец диапазона.
— Компаратор для сравнения элементов (по умолчанию less).

Алгоритм идет по диапазону от начала к концу и сравнивает каждый элемент с предыдущим с помощью компаратора.
Если нарушения порядка не найдено, возвращается итератор на конец диапазона. Иначе возвращается итератор на первый нарушающий элемент.

Этот алгоритм удобен, чтобы проверить, в какой момент отсортированный диапазон теряет порядок.
#код
11👍7
std::apply

std::apply — это функция, которая принимает в качестве аргументов вызываемый объект и кортеж аргументов, а затем вызывает этот объект с элементами кортежа в качестве аргументов. Это позволяет удобно вызывать функции с аргументами, хранящимися в кортеже.

В этом примере мы создаем кортеж args, содержащий два аргумента для функции add. Затем мы используем std::apply для вызова функции add с этими аргументами. В конце мы выводим результат на экран.
#код
👍23
Функция resize

Функция resize служит для изменения размера контейнеров, например вектора или deque.
Она динамически меняет количество элементов в контейнере на указанное число.

Например, для вектора numbers вызов:
numbers.resize(100);

Установит размер вектора в 100 элементов.
Если изначально элементов было меньше — новые будут инициализированы по умолчанию (нулями). Если было больше — лишние удалятся.

Также можно явно задать значение для инициализации:
numbers.resize(80, -1);

Также resize принимает вектор-шаблон для копирования значений при расширении.
#код
👍16
Алгоритм lexicographic_compare

Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле .

Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.

Работает для любых типов данных, которые можно сравнивать с помощью <.
#код
👍5
std::pair

std::pair — это шаблон класса из стандартной библиотеки, который инкапсулирует пару значений разных типов.
Он часто используется для возврата нескольких значений из функции.

В этом примере getStats возвращает пару значений — сумму и среднее элементов массива. С помощью std::pair эти значения упаковываются в один возвращаемый объект. В main используется structured binding для распаковки пары в переменные sum и avg.
#код
👍22
for-each циклы

Цикл for-each — это удобный способ перебрать все элементы контейнера (массива, вектора и т. д.). Синтаксис:

for (type element : container) {
// тело цикла
}

Цикл последовательно проходит по всем элементам контейнера и записывает каждый в переменную element.
#код
17👍8😁4
requires clause

requires clause в С++20 — это новый синтаксис для задания требований к шаблонам, альтернативный requires-выражениям.

requires clause позволяет задавать требования к типам непосредственно при объявлении шаблона. Это делает код более читабельным и понятным.

Requires clause применяется для:
— Проверки наличия определенных возможностей у типов-параметров шаблонов.
— Ограничения допустимых типов-параметров.
— Условного компилирования шаблонов в зависимости от типов.

В примере requires clause гарантирует, что функция add будет работать только с целочисленными типами.
Это делает намерения программиста явными и позволяет лучше контролировать вызовы шаблона.
#код
👍9
Как избежать deadlock

Deadlock (взаимная блокировка) возникает, когда два или более потока заблокированы в ожидании ресурса, который удерживается другим потоком.
Чтобы избежать deadlock, нужно следовать следующим правилам:

— Не блокировать ресурсы в разном порядке в разных потоках.
— Не удерживать блокировку во время выполнения долгих операций.
— Использовать lock_guard или unique_lock вместо явных lock/unlock.
— Избегать вложенных блокировок одного и того же мьютекса.
— Применять порядок блокировки ресурсов, например, всегда в алфавитном порядке.
— Использовать мьютексы только для защиты данных, а не для управления логикой.

Соблюдая эти правила, можно предотвратить ситуации взаимной блокировки потоков и построить корректную многопоточную логику.
#код
👍9🥰21
Паттерн Strategy

Паттерн Strategy — это паттерн проектирования, который позволяет определять семейства связанных алгоритмов и делать их взаимозаменяемыми.
Это дает возможность выбирать конкретный алгоритм во время выполнения программы.

Основная идея паттерна Strategy заключается в том, чтобы вынести алгоритмы в отдельные классы-стратегии и передавать нужную стратегию в клиентский код.

Это паттерн используется, когда:
— Нужно использовать разные варианты одного и того же алгоритма в разных ситуациях.
— Нужно легко добавлять новые стратегии, не меняя существующий клиентский код.
— Нужно избавиться от условных операторов, выбирающих алгоритм.
#код
👍123👏2🤔2
Принцип YAGNI

Принцип YAGNI (You Ain't Gonna Need It), который также известен как «Не добавляйте функциональность, пока она не понадобится».

В контексте С++ это означает, что при проектировании и разработке программы вы должны избегать лишней сложности, излишних функций и структур данных, которые не требуются на текущем этапе разработки. Вместо этого фокусируйтесь на решении актуальных задач и добавлении только тех функций, которые необходимы для выполнения текущих требований.

Этот принцип помогает избежать излишней сложности кода, упростить его поддержку и обеспечить более гибкую архитектуру, которая может легко адаптироваться к будущим изменениям и требованиям.
#код
👍22👏5