С++ Оценка времени выполнения кода

Оценка времени выполнения кода Весьма полезно иметь возможность оценить время выполнения какого-то фрагмента кода или потока чтобы выполнить оптимизацию. Для этого необходима библиотека #include «chrono» или #include «thread», которая уже включает библиотеку chrono. Суть измерения – запоминаем «системное» время в начале кода и по его окончанию и высчитываем разницу. За работу со временем отвечает библиотека […]

44. C++ Анонимные функции. Лямбда функции

Анонимные функции. Лямбда функции В языке C++ есть возможность создавать анонимные функции или же лямбда функции, т.е. функции без имени. Зачем это надо? Иногда для какого-либо теста или однократного выполнения какой-то операции не требуется создавать «глобальную» функцию, которая может использоваться многократно в документе. Также одним из преимуществ лямбда-функций является «управление зоной видимости» мы можем сами […]

43. C++ Полиморфная обертка функции

Полиморфная обертка функции Для работы с полиморфными обертками необходимо подключить библиотеку #include <functional> Объект класса functional является, по сути, указателем на любую функцию или лямбда-выражение, с которыми совпадают сигнатуры. Это весьма удобно, при создании функций, которые в качестве аргумента принимают еще какую-то функцию/функции. void Func1() { cout << «Hello World_1!» << endl; } void Func2() […]

25.1 C++ Функторы

Функторы В языке C++ Имеется возможность создания функторов – классов которые ведут себя как функции, но при этом имеют инкапсулированные данные Для этой цели производится перегрузка оператора (). class MyFunctor { public: void operator()(int a) // или void operator()() { cout<<«Code «<<cnt<<» a=»<<a<<endl; ++cnt; } private: int cnt=0; }; int main() { MyFunctor myF; myF(10); […]

C/C++ Директива typedef

Директива typedef Директива typedef является по своей сути дефайном/макроопределением, но для типов данных. Вспомним, что такое обычный дефайн #define –это директива препроцессора, заменяющая простые переменные/фрагменты кода. typedef по сути аналогичен define (и в ряде случаев может быть заменен), но он позволяет создать «новую» переменную и впоследствии пользоваться этим названием. Рассмотрим на примере: typedef const int* […]

C/C++ Многофайловые проекты

Многофайловые проекты Рано или поздно, но проект разрастается и становится трудночитабельным, а также труднопереносимым в другие проекты, для упрощения работы используется разбиение «мега проекта» на несколько мелких, функционально законченных проектов. Принцип в языках C/C++ примерно одинаков: создаются отдельные файлы с расширением .c/cpp для кода и файл заголовка .h для реализации. Примечание 1: желательно все файлы […]

C++. Цикл for each. Range-based циклы.

Цикл for each. Range-based циклы. Циклы, основанные на диапазонах. Цикл предназначен для контейнеров и итерирования по элементам контейнера и перебирать коллекцию элементов. В районе 11 стандарта С++ приняли новый вид цикла foreach, до этого IDE создали свои варианты цикла. foreach (var, container) //QtCreator { } for each (var in container) //Microsoft Visual Studio { } […]

C++. Ключевое слово auto

Ключевое слово auto Ключевое слово auto позволяет не указывать тип данных при его создании, этот тип подставится компилятором на основе ПРИСВОЕНИЯ ДАННЫХ при создании. Например: auto a=10; на этапе компиляции коммпилятор заменит auto a на int a т.е. int a=10; Для простых типов данных такая замена бессмысленна, но для итераторов это м.б. удобно. Ранее мы […]

42. C++ Умные указатели. Smart pointers.

Умные указатели. Smart pointers. В языке C++ одной из главных проблем являются утечки памяти, для упрощения работы с ними используются умные указатели. По сути умный указатель – шаблонный класс в конструкторе которого «захватывается» указатель на область в динамической памяти, а в деструкторе область освобождается. В чем смысл? Как известно деструктор вызывается при выходе из зоны […]

41. C++ Шаблоны классов / обобщенные классы ().

Шаблоны классов / обобщенные классы. Аналогично шаблонных функций в C++ можно создавать шаблонные классы, т.е. классы, которые конструируются на этапе компиляции. template<typename T> class MyClass { public:     MyClass(T value) {this->value=value;}     void PrintValue() {cout<<value<<endl;}     T getValue(){return this->value;} private:     T value; }; В функции main: MyClass<int> c_Int(10); MyClass<string> c_String(«Hello»); c_Int.PrintValue(); c_String.PrintValue(); Используя шаблон […]