Senior C++ Developer
13K subscribers
1.27K photos
3 videos
576 links
№ 4931128893
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr
Download Telegram
Оператор присваивания ( = ), строго говоря, является бинарным оператором. Его объявление идентично объявлению любого другого бинарного оператора со следующими исключениями:

☑️ Он должен быть нестатической функцией-членом.

☑️ Он не наследуется производными классами.

☑️ Компилятор может создать функцию operator = по умолчанию для типов классов, если она не существует.

В примере показано, как объявить оператор присваивания.
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.
Удаление элементов

Для удаления элементов из контейнера list могут применяться следующие функции:

clear(p): удаляет все элементы

pop_back(): удаляет последний элемент

pop_front(): удаляет первый элемент

erase(p): удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент

erase(begin, end): удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент

Применение всех функций представлено на картинке.
Wt

Wt — это фреймворк веб-приложений, который позволяет разработчикам создавать веб-приложения с использованием C++. Его встроенные виджеты и компоненты позволяют легко создавать сложные веб-приложения с минимальными усилиями.

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

https://www.webtoolkit.eu/wt
Алгоритм search

Ищет последовательность [first1, last1) для первого вхождения подпоследовательности, определенной [first2, last2), и возвращает итератор в свой первый элемент вхождения, или last1, если вхождения не найдены.
#вопросы_с_собеседований по Си
Что такое void указатель? Можно ли разыменовать указатель void, не зная его типа?

void указатель — это указатель, который можно использовать для указания на любые данные любого произвольного типа. Указатель void может быть разыменован только после явного приведения. Например:
int a = 5;
void *b = &a;
printf(“%d\n”, *((int*)b));
Почему я программирую на С/C++ (язык для профессионалов!)

Смотреть видео
Как в С++ обрабатывать ошибки в конструкторах без исключений?

Самый очевидный способ обработки ошибок — это возврат значений. Но конструкторы не возвращают значения, поэтому так поступить нельзя. Это и было одной из причин, по которой исключения появились в С++.

Смотреть статью
➡️ Библиотека PEGTL

PEGTL (Parsing Expression Grammar Template Library) — это библиотека для создания синтаксических анализаторов (парсеров) на C++. Она предоставляет мощные инструменты для определения грамматик и разбора текстов, что делает ее отличным выбором для создания языков программирования и обработки текстов.

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

🔗 Ссылочка на доку
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Библиотека SQLiteCpp

SQLiteCpp — это тонкая обертка вокруг SQLite, одной из самых популярных легковесных реляционных баз данных. Библиотека предоставляет удобный и безопасный интерфейс для работы с SQLite в C++, облегчая взаимодействие с базами данных.

Если вам нужно встроить простую, но мощную базу данных в ваше C++ приложение, SQLiteCpp — это то, что вам нужно.

🔗 Ссылочка на доку
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Сжатие данных с использованием std::vector::shrink_to_fit

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

Вектор заполняется 100 элементами, после чего большая часть элементов удаляется. Использование shrink_to_fit позволяет уменьшить емкость вектора до текущего количества элементов, что освобождает ненужную память.

Используйте shrink_to_fit, когда нужно минимизировать использование памяти после удаления большого числа элементов из вектора. Это улучшает производительность и снижает потребление ресурсов, что особенно важно в средах с ограниченной памятью.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Оптимизация доступа к элементам через std::deque с использованием индексации

std::deque — это контейнер, который позволяет эффективное добавление и удаление элементов как с начала, так и с конца. В отличие от std::vector, std::deque обеспечивает постоянное время доступа к элементам как в начале, так и в конце контейнера.

Используйте std::deque в тех случаях, когда вам нужен быстрый доступ к элементам по индексу, но также важна возможность эффективного добавления и удаления элементов с обоих концов контейнера.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Оптимизация работы с большими объектами с помощью std::move и семантики перемещения

std::move — это функция, которая превращает объект в "rvalue" (правостороннее значение), позволяя использовать семантику перемещения вместо копирования. Это особенно полезно при работе с большими объектами, где копирование может быть дорогим.

В этом примере используется std::move, чтобы передать большой объект LargeObject в функцию processLargeObject с использованием семантики перемещения. Вместо дорогостоящего копирования большого массива, память просто передается новому объекту, что значительно улучшает производительность.
Please open Telegram to view this post
VIEW IN TELEGRAM
➡️ Boost.MultiIndex — мощная библиотека для работы с контейнерами с множественной индексацией

Boost.MultiIndex — это часть популярной библиотеки Boost, которая предоставляет контейнеры с возможностью множественной индексации данных. Она позволяет хранить элементы в одном контейнере, но доступ к ним может осуществляться по разным критериям. Эта библиотека объединяет функциональность стандартных контейнеров, таких как std::set и std::map, в одном универсальном решении.

Boost.MultiIndex — отличный выбор, если вам нужно эффективно управлять данными с различными критериями поиска и сортировки. Она упрощает создание сложных структур данных, поддерживающих несколько способов доступа к элементам.

🔗 Ссылочка на доку
Please open Telegram to view this post
VIEW IN TELEGRAM
KISS (Keep it Simple, Stupid)

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

При проектировании алгоритмов важно использовать простые и понятные методы, которые легко понимаются другими программистами.

При написании кода важно использовать простые и понятные функции, которые выполняют только одну операцию. Например, вместо написания одной сложной функции, которая выполняет множество операций, можно написать несколько простых функций, которые выполняют каждую операцию отдельно.

При дизайне классов важно использовать простые и понятные методы, которые выполняют только одну операцию. Например, вместо создания одного сложного класса, который выполняет множество операций, можно создать несколько простых классов, каждый из которых выполняет отдельную операцию.

*На изображении представлен класс, удовлетворяющий принципу KISS
Спецификатор thread_local

Спецификатор thread_local позволяет создавать переменные, которые будут иметь своё значение для каждого потока, в который они будут загружены. То есть, каждый поток будет иметь свою собственную копию этой переменной.

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

В данном примере мы создали переменную x с помощью спецификатора thread_local. Затем мы создали функцию increment(), которая инкрементирует значение переменной x и выводит его на экран.

В функции main() мы создали два потока и передали им функцию increment(). Каждый поток будет иметь свою собственную копию переменной x, поэтому при выполнении функции increment() в каждом потоке будет изменяться только своя копия переменной x. После выполнения обоих потоков мы ожидаем завершения их работы с помощью метода join().
Функция none_of()

Эта функция возвращает true, если ни один из элементов не удовлетворяет данному условию, иначе возвращает false.

Поскольку все элементы положительны, функция возвращает true.