list::srot()に関して

[戻る]
bang 2003/12/24(水) 07:13:19
class CPerson{
      int age;
      ・
      ・
};

list<CPerson*> PersonList;

上の様に、listにCPersonのポインタを持たせているのですが
CPerson::ageを比較して、PersonList.sort()を正しく機能させるにはどうすれば良いでしょ
うか?
「operator<」には、CPerson& しか使えませんし、VC++のSTLの実装の問題で
比較関数も渡せないみたいなので困り果ててます…

επιστημη [E-Mail] [HomePage] 2003/12/24(水) 08:53:40
VC6のSTL実装では list::sort にお好みの比較オブジェクトを渡せませんから、
たとえば一旦vectorにコピーしてsortし、差し戻すしかないように思います。

bang 2003/12/24(水) 14:07:11
[[解決]]
やはりlist::sort()では無理みたいですね…
επιστημηさん ありがとうございました。

dairygoods 2003/12/24(水) 14:12:57
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*>());

bang 2003/12/25(木) 02:50:36
どうもdairygoodsさん。

まさに、希望の動作をしてくれるのですが、正直このコードが理解できません…
今までテンプレートはあまり使った事がなかったものでして。
それと、このコードを使った場合、なにか弊害があるのですか?

bang 2003/12/25(木) 04:19:36
追記です。

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を繰り返している様ですが、こんなものなのでしょうか?

επιστημη [E-Mail] [HomePage] 2003/12/25(木) 08:40:07
> ソートのたびに new, deleteを繰り返している様ですが、こんなものなのでしょうか?

new/delete されているのは Person ではないはず。

bang 2003/12/25(木) 09:03:29
>new/delete されているのは Person ではないはず。
確かにサイズからして、CPersonではないみたいですが、
これは至極当り前の事で、全く気にする事はないという理解で良いでしょうか?

επιστημη [E-Mail] [HomePage] 2003/12/25(木) 09:10:25
> これは至極当り前の事で、全く気にする事はないという理解で良いでしょうか?

当たり前とか気にするとかそーゆーんじゃなくて、"実装依存"ということです。
他のSTL実装では異なる振る舞いを呈するでしょう。

επιστημη [E-Mail] [HomePage] 2003/12/25(木) 09:13:01
> それと、このコードを使った場合、なにか弊害があるのですか?

dairygoods さんのご指摘のとおりです。
Person*の比較の意味を変えてしまいます。
それでかまわんならどうぞ。

bang 2003/12/25(木) 10:06:35
επιστημηさん良く分かりました。
比較は「return x->age > y->age」で良いので
dairygoodsさんに教えて頂いたのを使わせて頂く事にします。

お二人ともどうもありがとうございました。

古いスレッドには追加発言できません。