43. STL: Функциональные объекты: указатели, функторы, лямбда
Функциональный объект, также функтор — распространённая в программировании конструкция, позволяющая использовать объект как функцию. В C++ функциональный объект создаётся с помощью класса, у которого перегружен operator():
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
class MyLambda
{
public: void operator ()(int _x) const { cout << _x << " "; }
};
void main()
{
vector<int> srcVec;
for (int val = 0; val < 10; val++)
{
srcVec.push_back(val);
}
for_each(srcVec.begin(), srcVec.end(), MyLambda());
cout << endl;
}
Лямбда–выражения пошли из функциональных языков, их, в последнее время, начали добавлять также в императивные языки типа C#, C++ etc. Лямбдавыражениями называются безымянные локальные функции, которые можно создавать прямо внутри какоголибо выражения. Лямбда–выражения в C++ — это краткая форма записи анонимных функторов. Пример:
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
void main()
{
vector<int> srcVec;
for (int val = 0; val < 10; val++)
{
srcVec.push_back(val);
}
for_each(srcVec.begin(), srcVec.end(), [](int _n)
{
cout << _n << " ";
});
cout << endl;
}
Фактически оба кода выше выполняют одну и ту же работу.
Указатель – переменная, значением которой является адрес ячейки памяти. Указатель может ссылаться на переменную или функцию. Для этого нужно знать адрес переменной или функции. Так вот, чтобы узнать адрес конкретной переменной в С++ существует операция взятия адреса &. Такая операция извлекает адрес объявленных переменных, для того, чтобы его присвоить указателю. Указатели используются для передачи по ссылке данных, что намного ускоряет процесс обработки этих данных (в том случае, если объём данных большой), так как их не надо копировать, как при передаче по значению, то есть, используя имя переменной. В основном указатели используются для организации динамического распределения памяти, например при объявлении массива, не надо будет его ограничивать в размере. Пример:
int* p;