C++アダプタ機能実装および関数オブジェクト

1719 ワード

多くのSTLアルゴリズムはfunction objectsも関数オブジェクトfunctorsとも呼ばれ、1つのオブジェクトであり、()オペレータをリロードすることで、関数を呼び出すようにこのオブジェクトを使用することができます.
例えば簡単なsortアルゴリズム:
vector vec;

......

sort(vec.begin(), vec.end());

ではvecをソートできますが、vecがintではなくカスタムタイプをインストールしている場合は.
LeetCodeで最も好きなチェーンテーブルデータ構造のように:
struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(nullptr) {}
};


ListNodeのサイズを比較する必要がある場合は、次の3つの方法で実現できます.
メソッド1 adaptor機能のデータ構造を定義する
struct adaptor
{
	ListNode *a;
	bool operatorval < n.a->val;
	}
};

では、ソートできます.
void sortVec(vector &vln)
	{
		sort(vln.begin(), vln.end());
	}

方法2この機能を実現するために比較関数を定義することもできます.
bool compList(const ListNode t1, const ListNode t2)
{
	return t1.val < t2.val;
}
sort(vl.begin(), vl.end(), compList);

方法3はfunctorを定義して実現する.
struct functor
{
	bool operator()(ListNode a, ListNode b)
	{
		return a.val < b.val;
	}
};
sort(vl.begin(), vl.end(), functor());

2つのパラメータの操作関数を1つのパラメータの関数に変更する必要がある場合があります.次に示すように、クラスを定義して実装することもできます.
template 
bool tooBig(const T & val, const T & lim)
{
return val > lim;
}
template
class TooBig2
{
private:
T cutoff;
public:
TooBig2(const T & t) : cutoff(t) {}
bool operator()(const T & v) { return tooBig(v, cutoff); }
};

これにより、二値比較は次のように実現されます.
TooBig2 tB100(100);
int x;
cin >> x;
if (tB100(x)) // same as if (tooBig(x,100))