Что такое хеш-функция? Объясните на примере
Хеш-функция - это функция, которая принимает на вход некоторые данные и возвращает фиксированный размер выходных данных, называемый хешем. Такие функции широко используются в C++ для решения задач с поиском и индексированием данных. Они позволяют быстро находить элементы в массивах или хранилищах данных.
Рассмотрим применение на примере кода выше:
Мы создаем объект хеш-функции для строки и используем его для вычисления хеша для строки "
➡️ @cpp_geek
Хеш-функция - это функция, которая принимает на вход некоторые данные и возвращает фиксированный размер выходных данных, называемый хешем. Такие функции широко используются в C++ для решения задач с поиском и индексированием данных. Они позволяют быстро находить элементы в массивах или хранилищах данных.
Рассмотрим применение на примере кода выше:
Мы создаем объект хеш-функции для строки и используем его для вычисления хеша для строки "
Hello, world!
". Результатом выполнения программы будет вывод на экран хеш-значения для этой строки.➡️ @cpp_geek
Удаление всех вхождений элемента в массив
В этом методе сдвиньте нецелевой элемент в левую сторону.
⚫️ Проверьте, является ли текущий элемент целевым элементом или нет.
⚫️ Если это целевой элемент, увеличьте переменную cnt.
⚫️ После этого элемента все нецелевые элементы сдвинутся влево с промежутком (n-cnt).
Временная сложность:
Сложность пространства:
На картинке приведена программа на C ++ для удаления всех вхождений элемента из массива с использованием оптимизированного подхода.
➡️ @cpp_geek
В этом методе сдвиньте нецелевой элемент в левую сторону.
Временная сложность:
O(n)
Сложность пространства:
O(1)
На картинке приведена программа на C ++ для удаления всех вхождений элемента из массива с использованием оптимизированного подхода.
➡️ @cpp_geek
Please open Telegram to view this post
VIEW IN TELEGRAM
Получить текущее время и дату в C++
Начиная с C++11, стандартным решением для получения текущего времени и даты в C++ является использование библиотеки chrono.
Мы можем получить текущее время с помощью
Затем преобразовать
➡️ @cpp_geek
Начиная с C++11, стандартным решением для получения текущего времени и даты в C++ является использование библиотеки chrono.
Мы можем получить текущее время с помощью
std::chrono::system_clock::now() от hrono.h
хедера и преобразовать его в std::time_t
тип (время от эпохи).Затем преобразовать
std::time_t
на местное календарное время std::ctime
в Www Mmm dd hh:mm:ss yyyy формате, как показано на картинке.➡️ @cpp_geek
Просмотр все файлов в папке с помощью C++
Для того, чтобы просмотреть все файлы в папке с помощью C++, можно использовать функцию
В данном примере мы получаем текущую директорию с помощью функции
➡️ @cpp_geek
Для того, чтобы просмотреть все файлы в папке с помощью C++, можно использовать функцию
std::filesystem::directory_iterator()
. Данная функция позволяет перебирать все файлы в указанной директории.В данном примере мы получаем текущую директорию с помощью функции
fs::current_path()
, а затем проходим по всем файлам в этой директории с помощью цикла for
. Внутри цикла мы выводим путь к каждому файлу с помощью метода entry.path()
.➡️ @cpp_geek
Алгоритм is_sorted_until
Используется для определения первого несортированного элемента в диапазоне [
Его также можно использовать для подсчета общего количества отсортированных элементов в диапазоне. Он определяется внутри файла заголовка. Если весь диапазон отсортирован, он вернет итератор, указывающий на последний.
➡️ @cpp_geek
Используется для определения первого несортированного элемента в диапазоне [
first
, last
). Он возвращает итератор к первому несортированному элементу в диапазоне, поэтому все элементы между первым и возвращенным итератором сортируются.Его также можно использовать для подсчета общего количества отсортированных элементов в диапазоне. Он определяется внутри файла заголовка. Если весь диапазон отсортирован, он вернет итератор, указывающий на последний.
➡️ @cpp_geek
Оператор присваивания
✅ Он должен быть нестатической функцией-членом.
✅ Он не наследуется производными классами.
✅ Компилятор может создать функцию operator = по умолчанию для типов классов, если она не существует.
В примере показано, как объявить оператор присваивания.
➡️ @cpp_geek
( = )
, строго говоря, является бинарным оператором. Его объявление идентично объявлению любого другого бинарного оператора со следующими исключениями:В примере показано, как объявить оператор присваивания.
➡️ @cpp_geek
Please open Telegram to view this post
VIEW IN TELEGRAM
Алгоритм stable_partition
Упорядочивает последовательность, определенную параметрами
➡️ @cpp_geek
Упорядочивает последовательность, определенную параметрами
start
и end
, так, чтобы все элементы, для которых предикат возвращал true, предшествовали тем, для которых предикат возвращает false
. Разметка стабильная. Это означает, что относительный порядок последовательности сохраняется.➡️ @cpp_geek
std::async
В C++ std::async — это шаблон функции, предоставляемый стандартной библиотекой. Он используется для асинхронного выполнения функции или вызываемого объекта и получения объекта future, представляющего результат вычислений.
Функция std::async создает новый поток или использует существующий поток из пула потоков реализации для выполнения поставленной задачи. Она возвращает объект std::future, который можно использовать для получения результата или статуса вычисления.
В этом примере функция AddNumbers выполняется асинхронно с использованием std::async. Она принимает два целых числа в качестве аргументов и возвращает их сумму. Функция std::async вызывается с помощью AddNumbers и аргументов 5 и 10.
Функция std::async возвращает объект std::future, который представляет собой результат вычисления. Вызывая функцию get() на объекте future, мы блокируем выполнение до завершения вычислений и получаем результат.
➡️ @cpp_geek
В C++ std::async — это шаблон функции, предоставляемый стандартной библиотекой. Он используется для асинхронного выполнения функции или вызываемого объекта и получения объекта future, представляющего результат вычислений.
Функция std::async создает новый поток или использует существующий поток из пула потоков реализации для выполнения поставленной задачи. Она возвращает объект std::future, который можно использовать для получения результата или статуса вычисления.
В этом примере функция AddNumbers выполняется асинхронно с использованием std::async. Она принимает два целых числа в качестве аргументов и возвращает их сумму. Функция std::async вызывается с помощью AddNumbers и аргументов 5 и 10.
Функция std::async возвращает объект std::future, который представляет собой результат вычисления. Вызывая функцию get() на объекте future, мы блокируем выполнение до завершения вычислений и получаем результат.
➡️ @cpp_geek
Есть ли преимущества одного фрагмента кода перед другим? Если да, то какие?
Хотя оба варианта выполняют одно и то же, второй вариант лучше с точки зрения производительности. Это связано с тем, что оператор постинкремента
Тем не менее, многие компиляторы автоматически оптимизируют первый вариант, преобразовывая его во второй.
➡️ @cpp_geek
Хотя оба варианта выполняют одно и то же, второй вариант лучше с точки зрения производительности. Это связано с тем, что оператор постинкремента
itr++
дороже, чем оператор предварительного инкремента ++itr
. Базовая реализация оператора постинкремента создает копию элемента перед его увеличением, а затем возвращает копию.Тем не менее, многие компиляторы автоматически оптимизируют первый вариант, преобразовывая его во второй.
➡️ @cpp_geek
PIMPL (Pointer to Implementation)
PIMPL — это паттерн программирования, который позволяет скрыть внутреннюю реализацию класса от клиента, а также упростить перекомпиляцию кода и улучшить производительность.
Суть PIMPL-паттерна заключается в том, что все данные хранятся в отдельном класс, а в основном хранится только указатель на этот вспомогательный класс, в котором осуществляется вся работа с данными.
В данном примере пользователь класса MyObject не видит внутреннюю реализацию объекта, что позволяет добавлять/удалять поля без необходимости изменять интерфейс класса. Работа с внутренними данными осуществляется через методы класса Impl, которые вызываются в функциях-членах класса MyObject.
➡️ @cpp_geek
PIMPL — это паттерн программирования, который позволяет скрыть внутреннюю реализацию класса от клиента, а также упростить перекомпиляцию кода и улучшить производительность.
Суть PIMPL-паттерна заключается в том, что все данные хранятся в отдельном класс, а в основном хранится только указатель на этот вспомогательный класс, в котором осуществляется вся работа с данными.
В данном примере пользователь класса MyObject не видит внутреннюю реализацию объекта, что позволяет добавлять/удалять поля без необходимости изменять интерфейс класса. Работа с внутренними данными осуществляется через методы класса Impl, которые вызываются в функциях-членах класса MyObject.
➡️ @cpp_geek
В чем проблема следующего фрагмента?
Из спецификации (C++11 §5.3.5/3):
Если статический тип подлежащего удалению объекта отличается от его динамического типа, статический тип должен быть базовым классом динамического типа подлежащего удалению объекта и иметь виртуальный деструктор или поведение
➡️ @cpp_geek
Из спецификации (C++11 §5.3.5/3):
Если статический тип подлежащего удалению объекта отличается от его динамического типа, статический тип должен быть базовым классом динамического типа подлежащего удалению объекта и иметь виртуальный деструктор или поведение
undefined
.➡️ @cpp_geek
Что за ошибка в приведенном ниже коде и как ее исправить?
Последним аргументом memset должен быть
➡️ @cpp_geek
Последним аргументом memset должен быть
sizeof(*bar)
, а не sizeof(bar). sizeof(bar)
вычисляет размер bar
(то есть самого указателя), а не размер структуры, на которую указывает bar. Поэтому код можно исправить, используя sizeof(*bar)
в качестве последнего аргумента вызова memset
.➡️ @cpp_geek
Сравниваем 2 строки на одинаковые буквы
Для сравнения двух строк на одинаковые буквы можно использовать стандартную функцию
В данном примере две строки "hello" и "holle" сравниваются на одинаковые буквы. Функция
➡️ @cpp_geek
Для сравнения двух строк на одинаковые буквы можно использовать стандартную функцию
strcmp()
из библиотеки.В данном примере две строки "hello" и "holle" сравниваются на одинаковые буквы. Функция
strcmp()
возвращает 0, если строки совпадают, и любое другое число, если строки не совпадают. Если строки содержат одинаковые буквы, выводится сообщение "Строки содержат одинаковые буквы", иначе - "Строки содержат разные буквы".➡️ @cpp_geek
This media is not supported in your browser
VIEW IN TELEGRAM
Бесплатное IT-образование в 2024
Отобрали для вас полезные телеграм-каналы, которые помогут освоить программирование и другие IT-направления
Выбирайте нужное и подписывайтесь:
👩💻 С/С++: @Cpportal
📱 GitHub: @git_developer
🤓 Книги айти: @portalToIT
👩💻 Golang: @juniorGolang
👩💻 PHP: @PHPortal
👩💻 Моб. разработка: @MobDev
👩💻 Java: @Java_Iibrary
👩💻 Frontend: @FrontendPortal
⚙️ Backend: @BackendPortal
👩💻 Python: @PythonPortal
👩💻 C#: @KodBlog
🖥 Базы Данных & SQL: @SQL
👩💻 Разработка игр: @GameDevgx
👩💻 DevOps: @loose_code
🖥 Data Science: @DataSciencegx
🤔 Хакинг & ИБ: @cybersecinform
🐞 Тестирование: @QAPortal
📱 Маркетинг: @MarketingPortal
🖥 Дизайн: @PortalToDesign
➡️ Сохраняйте себе, чтобы не потерять
Отобрали для вас полезные телеграм-каналы, которые помогут освоить программирование и другие IT-направления
Выбирайте нужное и подписывайтесь:
🐞 Тестирование: @QAPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
Узнаем сколько лет человеку по дате его рождения
В этом коде мы запрашиваем у пользователя его дату рождения, а затем получаем текущую дату с помощью функции
➡️ @cpp_geek
В этом коде мы запрашиваем у пользователя его дату рождения, а затем получаем текущую дату с помощью функции
time
. Затем мы используем структуру tm для извлечения года, месяца и дня из текущей даты и вычисляем количество полных лет с помощью формулы now->tm_year + 1900 - year. Если текущий месяц и день меньше, чем месяц и день рождения, мы уменьшаем возраст на 1. Наконец, мы выводим результат на экран.➡️ @cpp_geek
Что такое rvalue, lvalue?
lvalue — это всё, что имеет имя, rvalue — это то, что имени не имеет. Исторически сложились такие названия, потому что lvalue всегда было то, что писалось с левой стороны присваивающего выражения, а rvalue — это то, что появлялось только справа от этого выражения.
➡️ @cpp_geek
lvalue — это всё, что имеет имя, rvalue — это то, что имени не имеет. Исторически сложились такие названия, потому что lvalue всегда было то, что писалось с левой стороны присваивающего выражения, а rvalue — это то, что появлялось только справа от этого выражения.
➡️ @cpp_geek
std::sort
std::sort — это функция стандартной библиотеки для сортировки элементов в контейнерах, таких как вектор или список.
Чтобы использовать std::sort, нужно подключить заголовочный файл .
Метод принимает в качестве аргументов итераторы на начало и конец сортируемой последовательности и сортирует элементы в возрастающем порядке по умолчанию.
Для определения порядка сортировки можно указать свой компаратор.
➡️ @cpp_geek
std::sort — это функция стандартной библиотеки для сортировки элементов в контейнерах, таких как вектор или список.
Чтобы использовать std::sort, нужно подключить заголовочный файл .
Метод принимает в качестве аргументов итераторы на начало и конец сортируемой последовательности и сортирует элементы в возрастающем порядке по умолчанию.
Для определения порядка сортировки можно указать свой компаратор.
➡️ @cpp_geek
Что такое std::sample?
Описание его функциональности:
1. Выбирает n уникальных элементов случайным образом из входного диапазона
2. Копирует выбранные элементы в выходной диапазон
3. Сохраняет относительный порядок выбранных элементов
Синтаксис:
- input_begin и input_end — итераторы входного диапазона
- output_begin — итератор выходного диапазона
- n — количество элементов для выборки
- generator — генератор случайных чисел
➡️ @cpp_geek
std::sample
— алгоритм который позволяет брать случайный элемент из диапазона. Был введён в C++ 17. Описание его функциональности:
1. Выбирает n уникальных элементов случайным образом из входного диапазона
2. Копирует выбранные элементы в выходной диапазон
3. Сохраняет относительный порядок выбранных элементов
Синтаксис:
std::sample(input_begin, input_end, output_begin, n, generator);
- input_begin и input_end — итераторы входного диапазона
- output_begin — итератор выходного диапазона
- n — количество элементов для выборки
- generator — генератор случайных чисел
➡️ @cpp_geek
std::variant
Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке .
Шаблонный класс
Основными функциями
В этом примере мы создаем объект
Однако, если мы попытаемся получить значение, используя неправильный тип (например,
➡️ @cpp_geek
Это фича C++17, обеспечивающая типобезопасное объединение, позволяющее хранить и манипулировать значениями разных типов в одном объекте. Она является частью стандартной библиотеки C++ и определена в заголовке .
Шаблонный класс
std::variant
похож на упрощенную версию union, но с дополнительной безопасностью типов и поддержкой различных операций.Основными функциями
std::variant
являются index()
, valueless_by_exception()
, operator=, emplace
.В этом примере мы создаем объект
var
, который может содержать значения типов int
, float
или std::string
. Мы присваиваем var
различные значения и получаем их с помощью std::get
.Однако, если мы попытаемся получить значение, используя неправильный тип (например,
std::get(var)
, когда вариант содержит std::string
, это вызовет исключение std::bad_variant_access
.➡️ @cpp_geek