Константные методы
В C++, ключевое слово
Когда вы вызываете константный метод для объекта класса, компилятор гарантирует, что внутри этого метода вы не будете изменять члены данных объекта, кроме членов, объявленных как
В C++, ключевое слово
const имеет различное значение в зависимости от контекста. Оно может быть применено к методам классов для указания, что метод не будет изменять состояние объекта, на котором он вызывается. Такие методы называются «константными методами». Когда вы вызываете константный метод для объекта класса, компилятор гарантирует, что внутри этого метода вы не будете изменять члены данных объекта, кроме членов, объявленных как
mutable (они могут изменяться внутри константных методов).This media is not supported in your browser
VIEW IN TELEGRAM
⚡ Основные алгоритмы на графах
Рассмотрим основные алгоритмы на графах и их реализацию на C++.
Рассматриваемые алгоритмы
▪Обход графа в ширину (Поиск в ширину) aka BFS | Breadth First Search
▪Обход графа в глубину (Поиск в глубину) aka DFS | Depth First Search
▪Алгоритм Дейкстры
▪Алгоритм Флойда-Уоршелла
▪Алгоритм Прима
Смотреть статью
Рассмотрим основные алгоритмы на графах и их реализацию на C++.
Рассматриваемые алгоритмы
▪Обход графа в ширину (Поиск в ширину) aka BFS | Breadth First Search
▪Обход графа в глубину (Поиск в глубину) aka DFS | Depth First Search
▪Алгоритм Дейкстры
▪Алгоритм Флойда-Уоршелла
▪Алгоритм Прима
Смотреть статью
Использование Boost
Если ваш проект открыт для поддержки библиотеки, рассмотрите возможность использования boost::algorithm::join алгоритм. Он объединяет все элементы в указанном списке в строку, где сегменты объединяются заданным разделителем.
Другие способы преобразования вектора в строку можно найти здесь.
Если ваш проект открыт для поддержки библиотеки, рассмотрите возможность использования boost::algorithm::join алгоритм. Он объединяет все элементы в указанном списке в строку, где сегменты объединяются заданным разделителем.
Другие способы преобразования вектора в строку можно найти здесь.
Задача
Найти среднее арифметическое в трех рядах.
Для начала продумаем наше решение. Сразу условимся что длинна ряда у нас будет 5 . Хотите ставьте своё число. Нам надо найти среднее арифметическое в трех рядах, и в каждом по отдельности, т.е. мы сначала сделаем цикл для рядов, а потом в этом цикле сделаем еще один цикл только уже для чисел этого ряда.
Теперь подумаем какие переменные нам понадобятся :
Переменная summa — для суммы чисел каждого ряда
Переменная average — для среднего арифметического каждого ряда
Переменная number — обычное число которое мы будем постоянно прибавлять
Переменные i и j — для циклов, перпенные у нас будут локальные, т.е. использоваться и объявляться и цикле.
Найти среднее арифметическое в трех рядах.
Для начала продумаем наше решение. Сразу условимся что длинна ряда у нас будет 5 . Хотите ставьте своё число. Нам надо найти среднее арифметическое в трех рядах, и в каждом по отдельности, т.е. мы сначала сделаем цикл для рядов, а потом в этом цикле сделаем еще один цикл только уже для чисел этого ряда.
Теперь подумаем какие переменные нам понадобятся :
Переменная summa — для суммы чисел каждого ряда
Переменная average — для среднего арифметического каждого ряда
Переменная number — обычное число которое мы будем постоянно прибавлять
Переменные i и j — для циклов, перпенные у нас будут локальные, т.е. использоваться и объявляться и цикле.
🖼 Axodox machinelearning
Чистая реализация на C++ синтеза изображений на основе стабильной диффузии, включая txt2img, img2img и inpainting.
Github
Чистая реализация на C++ синтеза изображений на основе стабильной диффузии, включая txt2img, img2img и inpainting.
Github
Начало работы с Qt
Минимальный исходный код приложения Qt(часть 1).
QApplication — очень важный класс. Он заботится о входных аргументах, а также о многих других вещах, и в первую очередь о цикле обработки событий . Цикл событий — это цикл, ожидающий ввода данных пользователем в приложениях с графическим интерфейсом.
Давайте скомпилируем это приложение. Нажав на зеленую стрелку в левом нижнем углу, Qt Creator скомпилирует и выполнит его.
И что случилось? Приложение как бы запущено и не отвечает. Это на самом деле нормально. Цикл событий работает и ожидает событий, таких как щелчки мышью в графическом интерфейсе, но мы не предоставили никаких событий для обработки, поэтому он будет выполняться бесконечно.
Давайте добавим что-то для отображения(часть 2). Скомпилируйте его и… вот оно! Наше первое окно!
Минимальный исходный код приложения Qt(часть 1).
QApplication — очень важный класс. Он заботится о входных аргументах, а также о многих других вещах, и в первую очередь о цикле обработки событий . Цикл событий — это цикл, ожидающий ввода данных пользователем в приложениях с графическим интерфейсом.
Давайте скомпилируем это приложение. Нажав на зеленую стрелку в левом нижнем углу, Qt Creator скомпилирует и выполнит его.
И что случилось? Приложение как бы запущено и не отвечает. Это на самом деле нормально. Цикл событий работает и ожидает событий, таких как щелчки мышью в графическом интерфейсе, но мы не предоставили никаких событий для обработки, поэтому он будет выполняться бесконечно.
Давайте добавим что-то для отображения(часть 2). Скомпилируйте его и… вот оно! Наше первое окно!
Пример оконного приложения на C++ Qt
В программе окно создается на основе библиотечного класса QFrame. Этот класс является потомком класса QWidget. Так что можно без всяких проблем заменить в программе QFrame на QWidget.
Подробнее можно почитать здесь.
В программе окно создается на основе библиотечного класса QFrame. Этот класс является потомком класса QWidget. Так что можно без всяких проблем заменить в программе QFrame на QWidget.
Подробнее можно почитать здесь.
#вопросы_с_собеседований
Как работает оператор new в C++ и почему используется именно этот оператор для выделения динамической памяти?
Оператор new используется в C++ для выделения динамической памяти (heap memory), которая выделяется во время выполнения программы. При его вызове, сначала выделяется необходимое количество памяти из операционной системы, а затем возвращается указатель на эту область памяти.
При исполнении оператора new происходит следующее:
1. Сначала он выделяет память в размере, указанном в аргументе оператора или размере типа данных, на который указывает указатель.
2. Затем он вызывает конструктор для создания объекта в выделенной области памяти.
3. Возвращает указатель на выделенную память.
Оператор new является предпочтительным для выделения памяти по сравнению с функцией malloc в C, поскольку он позволяет при выделении памяти автоматически вызывать конструкторы объектов. С использованием оператора new не нужно явно выделять память под объекты и вызывать конструкторы отдельно.
В данном примере оператор new выделяет память под объект класса MyClass и вызывает его конструктор. Оператор delete используется для освобождения ранее выделенной памяти.
Как работает оператор new в C++ и почему используется именно этот оператор для выделения динамической памяти?
Оператор new используется в C++ для выделения динамической памяти (heap memory), которая выделяется во время выполнения программы. При его вызове, сначала выделяется необходимое количество памяти из операционной системы, а затем возвращается указатель на эту область памяти.
При исполнении оператора new происходит следующее:
1. Сначала он выделяет память в размере, указанном в аргументе оператора или размере типа данных, на который указывает указатель.
2. Затем он вызывает конструктор для создания объекта в выделенной области памяти.
3. Возвращает указатель на выделенную память.
Оператор new является предпочтительным для выделения памяти по сравнению с функцией malloc в C, поскольку он позволяет при выделении памяти автоматически вызывать конструкторы объектов. С использованием оператора new не нужно явно выделять память под объекты и вызывать конструкторы отдельно.
В данном примере оператор new выделяет память под объект класса MyClass и вызывает его конструктор. Оператор delete используется для освобождения ранее выделенной памяти.
#вопросы_с_собеседований
Предполагая, что buf является валидным указателем, в чем проблема в приведенном на картинке коде? Каким был бы альтернативный способ реализации этого, который позволил бы избежать этой проблемы?
Проблема в коде заключается в том, что --sz >= 0 всегда будет истинным, поэтому вы никогда не выйдете из цикла while (поэтому вы, вероятно, в конечном итоге испортите память или вызовете какое-то нарушение памяти или какой-либо другой программный сбой, в зависимости от того, что вы делаете внутри цикла). Причина, по которой --sz >= 0 всегда будет истинной, заключается в том, что тип sz равен size_t. size_t на самом деле просто псевдоним одного из основных беззнаковых целочисленных типов. Следовательно, поскольку sz не имеет знака, оно никогда не может быть меньше нуля (поэтому условие никогда не может быть ложным). Одним из примеров альтернативной реализации, позволяющей избежать этой проблемы, может быть использование цикла for следующим образом:
Предполагая, что buf является валидным указателем, в чем проблема в приведенном на картинке коде? Каким был бы альтернативный способ реализации этого, который позволил бы избежать этой проблемы?
Проблема в коде заключается в том, что --sz >= 0 всегда будет истинным, поэтому вы никогда не выйдете из цикла while (поэтому вы, вероятно, в конечном итоге испортите память или вызовете какое-то нарушение памяти или какой-либо другой программный сбой, в зависимости от того, что вы делаете внутри цикла). Причина, по которой --sz >= 0 всегда будет истинной, заключается в том, что тип sz равен size_t. size_t на самом деле просто псевдоним одного из основных беззнаковых целочисленных типов. Следовательно, поскольку sz не имеет знака, оно никогда не может быть меньше нуля (поэтому условие никогда не может быть ложным). Одним из примеров альтернативной реализации, позволяющей избежать этой проблемы, может быть использование цикла for следующим образом:
for (size_t i = 0; i < sz; i++)Ключевое слово requires
Ключевое слово
В примере на картинке
Использование
#для_начинающих
Ключевое слово
requires используется в контексте концепций (concepts) для определения требований, которые тип должен удовлетворять. Концепции представляют собой инструмент в C++, введенный в стандарте C++20, который позволяет более точно указывать ограничения на типы данных, которые могут использоваться в шаблонах.В примере на картинке
Sortable — это концепция, описывающая типы, для которых определены операторы сравнения («<» и «>»). Функция sortAndPrint принимает два аргумента типа T, удовлетворяющего концепции Sortable, и сравнивает их.Использование
requires в данном контексте позволяет более явно указать ограничения на типы данных, которые могут использоваться в шаблонах и функциях, делая код более читаемым и безопасным.#для_начинающих
std::weak_ordering
#для_продвинутых
std::weak_ordering — это тип в C++, который введен в стандарте C++20 для использования в контексте трехсторонних операторов сравнения (таких как операторы <=> и ==). Этот тип предоставляет четыре значения: std::weak_ordering::equivalent, std::weak_ordering::less, std::weak_ordering::greater и std::weak_ordering::unordered.std::weak_ordering используется для сравнения объектов, когда сравнение может быть неоднозначным или невозможным, но при этом необходимо учесть отношение порядка. Например, при сравнении чисел с плавающей точкой, если одно или оба числа являются NaN (Not a Number), то результат сравнения может быть неопределенным. В таких случаях std::weak_ordering может использоваться для предоставления информации о том, являются ли объекты эквивалентными, меньшими, большими или не сравнимыми.#для_продвинутых
std::apply
#для_начинающих
std::apply — это функция, введенная в стандарте C++17, которая предоставляет возможность применения кортежа (или пары) в качестве аргументов функции. Это удобный способ передачи элементов кортежа в функцию, которая принимает переменное количество аргументов.#для_начинающих
В чем разница между статической и динамической библиотеками?
Статические и динамические библиотеки — это два основных типа библиотек, используемых в программировании на C++ (и в других языках программирования).
Статические библиотеки:
— Имеют расширение ".lib" (на платформе Windows) или ".a" (на платформах, таких как Linux).
— Код из статических библиотек копируется в исполняемый файл (или в другую статическую библиотеку) в момент компиляции. Это означает, что код библиотеки становится частью исполняемого файла.
Преимущества: Приложение не зависит от внешних библиотек во время выполнения, что делает его более портативным и проще в распространении.
Недостатки: Увеличивает размер исполняемого файла, и любые изменения в коде библиотеки требуют повторной компиляции всего приложения.
Динамические библиотеки:
— Имеют расширение ".dll" (на платформе Windows) или ".so" (на платформах, таких как Linux).
— Код из динамической библиотеки загружается в память во время выполнения программы. Это означает, что библиотека остается внешней и может быть загружена и выгружена во время выполнения.
Преимущества: Экономия памяти, так как код библиотеки не дублируется в каждом исполняемом файле. Легче обновлять библиотеки без перекомпиляции всего приложения.
Недостатки: Приложение зависит от наличия соответствующих динамических библиотек в системе во время выполнения. Требуется управление версиями и обработка конфликтов.
Статические и динамические библиотеки — это два основных типа библиотек, используемых в программировании на C++ (и в других языках программирования).
— Имеют расширение ".lib" (на платформе Windows) или ".a" (на платформах, таких как Linux).
— Код из статических библиотек копируется в исполняемый файл (или в другую статическую библиотеку) в момент компиляции. Это означает, что код библиотеки становится частью исполняемого файла.
Преимущества: Приложение не зависит от внешних библиотек во время выполнения, что делает его более портативным и проще в распространении.
Недостатки: Увеличивает размер исполняемого файла, и любые изменения в коде библиотеки требуют повторной компиляции всего приложения.
Динамические библиотеки:
— Имеют расширение ".dll" (на платформе Windows) или ".so" (на платформах, таких как Linux).
— Код из динамической библиотеки загружается в память во время выполнения программы. Это означает, что библиотека остается внешней и может быть загружена и выгружена во время выполнения.
Преимущества: Экономия памяти, так как код библиотеки не дублируется в каждом исполняемом файле. Легче обновлять библиотеки без перекомпиляции всего приложения.
Недостатки: Приложение зависит от наличия соответствующих динамических библиотек в системе во время выполнения. Требуется управление версиями и обработка конфликтов.
std::find_if
Вот общий формат
#для_начинающих
std::find_if — это стандартный алгоритм, предоставляемый библиотекой <algorithm>. Этот алгоритм предназначен для поиска первого элемента в заданном диапазоне, который удовлетворяет заданному условию, определенному предикатом.Вот общий формат
std::find_if:#include <algorithm>
template<class InputIt, class UnaryPredicate>
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p);
first и last представляют диапазон элементов для поиска. first указывает на начало диапазона, а last указывает за его пределы.p — это унарный предикат, то есть функция, принимающая один аргумент и возвращающая true, если элемент удовлетворяет условию, и false в противном случае.#для_начинающих
Создайте класс Rectangle с двумя закрытыми членами данных для длины и ширины. Добавьте конструктор по умолчанию, конструктор с параметрами и методы для расчета площади и периметра прямоугольника. Затем напишите функцию main, в которой создается объект класса Rectangle, используя динамическое выделение памяти, и выводятся площадь и периметр прямоугольника.
1) Класс Rectangle: Класс имеет два закрытых члена для длины и ширины. Он включает в себя конструктор по умолчанию и конструктор с параметрами.
2) Методы area и perimeter: Эти методы вычисляют площадь и периметр прямоугольника соответственно.
3) Динамическое Выделение Памяти: В функции main создается объект rect класса Rectangle с использованием оператора new. Это позволяет объекту сохранять свое состояние во время выполнения программы до явного освобождения памяти.
4) Вывод и Освобождение Памяти: Выводятся площадь и периметр, после чего освобождается память, выделенная для rect, с помощью оператора delete.
Этот вопрос тестирует понимание объектно-ориентированного программирования, работы с динамической памятью и основных концепций C++.
2) Методы area и perimeter: Эти методы вычисляют площадь и периметр прямоугольника соответственно.
3) Динамическое Выделение Памяти: В функции main создается объект rect класса Rectangle с использованием оператора new. Это позволяет объекту сохранять свое состояние во время выполнения программы до явного освобождения памяти.
4) Вывод и Освобождение Памяти: Выводятся площадь и периметр, после чего освобождается память, выделенная для rect, с помощью оператора delete.
Этот вопрос тестирует понимание объектно-ориентированного программирования, работы с динамической памятью и основных концепций C++.