В чем различия между dynamic_cast и reinterpret_cast?
Правильный ответ может звучать так:
Динамическое приведение — это безопасное приведение по иерархии наследования, в том числе и для виртуального наследования. Проводит преобразование типа, предварительно убедившись (с помощью RTTI), что объект expression_from в действительности является объектом типа type_to. Если нет: для указателей возвращает NULL.
При reinterpret_cast результат не гарантирован, проверки не осуществляются.
Ограничения на expression_from: порядковый тип (логический, символьный, целый, перечисляемый), указатель, ссылка.
Ограничения на type_to: для порядкового типа или указателя — порядковый тип или указатель. Для ссылки — ссылка.
➡️ @cpp_geek
Правильный ответ может звучать так:
Динамическое приведение — это безопасное приведение по иерархии наследования, в том числе и для виртуального наследования. Проводит преобразование типа, предварительно убедившись (с помощью RTTI), что объект expression_from в действительности является объектом типа type_to. Если нет: для указателей возвращает NULL.
При reinterpret_cast результат не гарантирован, проверки не осуществляются.
Ограничения на expression_from: порядковый тип (логический, символьный, целый, перечисляемый), указатель, ссылка.
Ограничения на type_to: для порядкового типа или указателя — порядковый тип или указатель. Для ссылки — ссылка.
➡️ @cpp_geek
Что такое хеш-функция? Объясните на примере
Хеш-функция - это функция, которая принимает на вход некоторые данные и возвращает фиксированный размер выходных данных, называемый хешем. Такие функции широко используются в 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