Алгоритм unique_copy
std::unique используется для удаления дубликатов любого элемента, присутствующего последовательно в диапазоне [первый, последний). Он выполняет эту задачу для всех подгрупп, присутствующих в диапазоне, в котором последовательно присутствует один и тот же элемент.
Но что, если мы не хотим изменять исходный диапазон, а просто хотим, чтобы результат std::unique был скопирован в другой контейнер, для этого у нас есть другая функция std::unique_copy() . При этом копируется только первый элемент из каждой последовательной группы эквивалентных элементов в диапазоне [first, last).
std::unique используется для удаления дубликатов любого элемента, присутствующего последовательно в диапазоне [первый, последний). Он выполняет эту задачу для всех подгрупп, присутствующих в диапазоне, в котором последовательно присутствует один и тот же элемент.
Но что, если мы не хотим изменять исходный диапазон, а просто хотим, чтобы результат std::unique был скопирован в другой контейнер, для этого у нас есть другая функция std::unique_copy() . При этом копируется только первый элемент из каждой последовательной группы эквивалентных элементов в диапазоне [first, last).
Функция strrchr()
В C++ strrchr() - это предопределенная функция, используемая для обработки строк. Эта функция возвращает указатель на всю строку после последнего появления заданного символа. Символ, последнее вхождение которого мы хотим найти, передается в качестве второго аргумента функции, а строка, в которой мы должны найти этот символ, передается в качестве первого аргумента функции.
В примере кода на картинке мы используем функцию для того, чтобы найти порядковый номер символа в заданной строке.
В C++ strrchr() - это предопределенная функция, используемая для обработки строк. Эта функция возвращает указатель на всю строку после последнего появления заданного символа. Символ, последнее вхождение которого мы хотим найти, передается в качестве второго аргумента функции, а строка, в которой мы должны найти этот символ, передается в качестве первого аргумента функции.
В примере кода на картинке мы используем функцию для того, чтобы найти порядковый номер символа в заданной строке.
Некоторые различия между ссылками и указателями
1. Указатель может быть объявлен void, а ссылка - никогда. Пример на картинке.
2. Переменная-указатель может иметь несколько уровней вложенности, то есть, например, бывают одиночные указатели, двойные указатели, тройные указатели. Ссылка же имеет только один единственный уровень вложенности.
3. Ссылочная переменная не может быть обновлена.
1. Указатель может быть объявлен void, а ссылка - никогда. Пример на картинке.
2. Переменная-указатель может иметь несколько уровней вложенности, то есть, например, бывают одиночные указатели, двойные указатели, тройные указатели. Ссылка же имеет только один единственный уровень вложенности.
3. Ссылочная переменная не может быть обновлена.
Алгоритм mismatch
Сравнивает две последовательности и находит первую позицию, где элементы различны.
Возвращается пара итераторов, каждый из которых указывает на эту позицию в соответствующей последовательности.
Если все элементы одинаковы, то каждый итератор в паре указывает на элемент last в своем контейнере.
Сравнивает две последовательности и находит первую позицию, где элементы различны.
Возвращается пара итераторов, каждый из которых указывает на эту позицию в соответствующей последовательности.
Если все элементы одинаковы, то каждый итератор в паре указывает на элемент last в своем контейнере.
Алгоритм lexicographic_compare
Совершает лексикографическое сравнение 2 диапазонов
Лексикографическое сравнение - это операция со следующими свойствами:
1)Два диапазона сравниваются поэлементно.
2)Первый элемент несовпадения определяет, какой диапазон лексикографически меньше или больше другого.
3)Если один диапазон является префиксом другого, более короткий диапазон лексикографически меньше другого.
4)Если два диапазона имеют эквивалентные элементы и имеют одинаковую длину, тогда диапазоны лексикографически равны.
5)Пустой диапазон лексикографически меньше любого непустого диапазона.
6)Два пустых диапазона лексикографически равны.
Совершает лексикографическое сравнение 2 диапазонов
Лексикографическое сравнение - это операция со следующими свойствами:
1)Два диапазона сравниваются поэлементно.
2)Первый элемент несовпадения определяет, какой диапазон лексикографически меньше или больше другого.
3)Если один диапазон является префиксом другого, более короткий диапазон лексикографически меньше другого.
4)Если два диапазона имеют эквивалентные элементы и имеют одинаковую длину, тогда диапазоны лексикографически равны.
5)Пустой диапазон лексикографически меньше любого непустого диапазона.
6)Два пустых диапазона лексикографически равны.
Преобразование типа с плавающей точкой в целочисленный
Язык C++ не предоставляет примитивную операцию округления чисел с плавающей точкой. Самым простым методом преобразования числа с плавающей точкой x в ближайшее целое число n будет оператор(см на картинке).
Используя такой метод, если x будет точно посередине между двумя целыми числами, то n будет округлено в большую сторону. Например, 0,5 -> 1; 1,5 -> 2; -0,5 -> 0; -1,5 -> -1.
Язык C++ не предоставляет примитивную операцию округления чисел с плавающей точкой. Самым простым методом преобразования числа с плавающей точкой x в ближайшее целое число n будет оператор(см на картинке).
Используя такой метод, если x будет точно посередине между двумя целыми числами, то n будет округлено в большую сторону. Например, 0,5 -> 1; 1,5 -> 2; -0,5 -> 0; -1,5 -> -1.
Неиспользуемые переменные
Подобный макрос есть, например, в cocos2d-x, там он называется CC_UNUSED_PARAM. Из недостатков: теоретически, он может работать не на всех компиляторах. Тем не менее, в cocos2d-x он для всех платформ определен абсолютно одинаково.
Для чего? Этот макрос позволяет избежать предупреждения о неиспользуемой переменной, а читающему код он как бы говорит: «тот кто писал это — знал, что переменная не используется, все в порядке».
Подобный макрос есть, например, в cocos2d-x, там он называется CC_UNUSED_PARAM. Из недостатков: теоретически, он может работать не на всех компиляторах. Тем не менее, в cocos2d-x он для всех платформ определен абсолютно одинаково.
Для чего? Этот макрос позволяет избежать предупреждения о неиспользуемой переменной, а читающему код он как бы говорит: «тот кто писал это — знал, что переменная не используется, все в порядке».
Создание TCP-сервера на C++
Это введение в сетевое программирование путем создания сервера, который возвращает сообщения клиента.
Смотреть видео
Это введение в сетевое программирование путем создания сервера, который возвращает сообщения клиента.
Смотреть видео
Алгоритм move
Синтаксис:
std :: move (first, last, result);
Перемещает элементы диапазона [first,last) в диапазон, начиная с позиции result.
Значение элементов в [first,last) массиве передается элементам, на которые указывает result. После вызова элементы в диапазоне [first,last) остаются в неопределенном, но допустимом состоянии.
Синтаксис:
std :: move (first, last, result);
Перемещает элементы диапазона [first,last) в диапазон, начиная с позиции result.
Значение элементов в [first,last) массиве передается элементам, на которые указывает result. После вызова элементы в диапазоне [first,last) остаются в неопределенном, но допустимом состоянии.
#вопросы_с_собеседований
Как работает оператор 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 используется для освобождения ранее выделенной памяти.
memmove
Функция
Функция
Функция
memmove
используется для копирования блока памяти из одного места в другое. Она объявлена в заголовочном файле <cstring>
. Она принимает аргументы типа void *
и const void *
, что позволяет ей работать с любыми типами данных. Она просто копирует указанное количество байтов из исходного буфера в целевой.memmove
может обрабатывать перекрывающиеся буферы. В отличие от memcpy
, которая просто копирует данные из одного места в другое, memmove
может безопасно перемещать данные, даже если исходный и целевой буферы перекрываются.Функция
memmove
может быть полезна для удаления элементов из массива. Например, если вы хотите удалить элемент из массива и сдвинуть оставшиеся элементы влево, вы можете использовать memmove
для перемещения данных в массиве.Константные методы
В C++, ключевое слово
Когда вы вызываете константный метод для объекта класса, компилятор гарантирует, что внутри этого метода вы не будете изменять члены данных объекта, кроме членов, объявленных как
В C++, ключевое слово
const
имеет различное значение в зависимости от контекста. Оно может быть применено к методам классов для указания, что метод не будет изменять состояние объекта, на котором он вызывается. Такие методы называются «константными методами». Когда вы вызываете константный метод для объекта класса, компилятор гарантирует, что внутри этого метода вы не будете изменять члены данных объекта, кроме членов, объявленных как
mutable
(они могут изменяться внутри константных методов).Что такое memory leak?
Утечка памяти может привести к постепенному увеличению объема занятой оперативной памяти программой. Если утечка продолжает развиваться, это может привести к уменьшению производительности программы и даже к завершению программы из-за нехватки доступной памяти.
Memory leak
(утечка памяти) — это ситуация, при которой программа использует динамическую память, но забывает освободить эту память перед завершением работы или перед повторным использованием. Как результат, выделенная память остается занята в оперативной памяти, несмотря на то, что она уже не используется, и таким образом происходит утечка памяти.Утечка памяти может привести к постепенному увеличению объема занятой оперативной памяти программой. Если утечка продолжает развиваться, это может привести к уменьшению производительности программы и даже к завершению программы из-за нехватки доступной памяти.
Перегрузка функций
Перегрузка функций — это возможность определения нескольких функций с одним и тем же именем, но разными параметрами. Когда вызывается такая функция, компилятор определяет, какая из перегруженных функций должна быть вызвана, основываясь на типах аргументов, переданных при вызове.
Таким образом можно создать несколько вариантов функции, которые выполняют аналогичные действия, но принимают разные типы аргументов. Это позволяет создавать более удобный и интуитивно понятный интерфейс для программистов, так как они могут вызывать одно и то же имя функции с разными типами данных, не заботясь о различиях в именах функций.
Перегрузка функций — это возможность определения нескольких функций с одним и тем же именем, но разными параметрами. Когда вызывается такая функция, компилятор определяет, какая из перегруженных функций должна быть вызвана, основываясь на типах аргументов, переданных при вызове.
Таким образом можно создать несколько вариантов функции, которые выполняют аналогичные действия, но принимают разные типы аргументов. Это позволяет создавать более удобный и интуитивно понятный интерфейс для программистов, так как они могут вызывать одно и то же имя функции с разными типами данных, не заботясь о различиях в именах функций.