class CPerson{
int age;
・
・
};
list<CPerson*> PersonList;
上の様に、listにCPersonのポインタを持たせているのですが
CPerson::ageを比較して、PersonList.sort()を正しく機能させるにはどうすれば良いでしょ
うか?
「operator<」には、CPerson& しか使えませんし、VC++のSTLの実装の問題で
比較関数も渡せないみたいなので困り果ててます…
VC6のSTL実装では list::sort にお好みの比較オブジェクトを渡せませんから、
たとえば一旦vectorにコピーしてsortし、差し戻すしかないように思います。
やはりlist::sort()では無理みたいですね…
επιστημηさん ありがとうございました。
Person*の比較の意味を変えてしまうのでお勧めできませんが。
typedef Person* PersonPtr;
template<> bool greater<PersonPtr>::operator()
(const PersonPtr &x, const PersonPtr &y) const {
return x->age > y->age;
}
list<PersonPtr> people;
people.sort(greater<Person*>());
どうもdairygoodsさん。
まさに、希望の動作をしてくれるのですが、正直このコードが理解できません…
今までテンプレートはあまり使った事がなかったものでして。
それと、このコードを使った場合、なにか弊害があるのですか?
追記です。
void* operator new(size_t size)
{
void *p = malloc(size);
FILE *fp = fopen(new.txt, at);
fprintf(fp, %p %u\n, p, size);
fclose(fp);
return p;
}
void operator delete(void *p)
{
FILE *fp = fopen(delete.txt, at);
fprintf(fp, %p %u\n, p, _msize(p));
fclose(fp);
free(p);
}
上の様にして、list<CPerson*>::sort(greater<CPerson*>())を実行してみた所、
ソートのたびに new, deleteを繰り返している様ですが、こんなものなのでしょうか?
> ソートのたびに new, deleteを繰り返している様ですが、こんなものなのでしょうか?
new/delete されているのは Person ではないはず。
>new/delete されているのは Person ではないはず。
確かにサイズからして、CPersonではないみたいですが、
これは至極当り前の事で、全く気にする事はないという理解で良いでしょうか?
> これは至極当り前の事で、全く気にする事はないという理解で良いでしょうか?
当たり前とか気にするとかそーゆーんじゃなくて、実装依存ということです。
他のSTL実装では異なる振る舞いを呈するでしょう。
> それと、このコードを使った場合、なにか弊害があるのですか?
dairygoods さんのご指摘のとおりです。
Person*の比較の意味を変えてしまいます。
それでかまわんならどうぞ。
επιστημηさん良く分かりました。
比較は「return x->age > y->age」で良いので
dairygoodsさんに教えて頂いたのを使わせて頂く事にします。
お二人ともどうもありがとうございました。