20項 ポインタの連想コンテナに対する比較の種類を指定しよう

ポインタの連想コンテナに対する比較の種類を指定しよう



ポインタの連想コンテナの比較方法を定義しないと、ポインタの値で比較されてしまいます。
文字列が英字順に並ぶことを期待した、次のコードは失敗します。

set<string*> ssp;

ssp.insert(new string("Anteater"));
ssp.insert(new string("Wonbat"));
ssp.insert(new string("Lemur"));
ssp.insert(new string("Pengin"));


typedef set<string*>::iterator itr;
for (itr i = ssp.begin(), end = ssp.end(); i != end; i++)
	cout << **i << endl; //ポインタの値でソートされている

ポインタの値でソートされているため、英字順には並びません。



対策は、ポインタの連想コンテナの比較用のテンプレートを作ることです。

struct DereferenceLess
{
	template<typename T>
	bool operator()(const T *ps1, const T *ps2) const
	{
		return *ps1 < *ps2;
	}
};

...

set<string*, DereferenceLess> ssp;