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;