list::srot()に関して – プログラミング – Home

通知
すべてクリア

[解決済] list::srot()に関して


bang
 bang
(@bang)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

class CPerson{
int age;


};

list<CPerson*> PersonList;

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


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

VC6のSTL実装では list::sort にお好みの比較オブジェクトを渡せませんから、
たとえば一旦vectorにコピーしてsortし、差し戻すしかないように思います。


返信引用
bang
 bang
(@bang)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

やはりlist::sort()では無理みたいですね…
επιστημηさん ありがとうございました。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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
 bang
(@bang)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

どうもdairygoodsさん。

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


返信引用
bang
 bang
(@bang)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

追記です。

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

> ソートのたびに new, deleteを繰り返している様ですが、こんなものなのでしょうか?

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


返信引用
bang
 bang
(@bang)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

> これは至極当り前の事で、全く気にする事はないという理解で良いでしょうか?

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

> それと、このコードを使った場合、なにか弊害があるのですか?

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


返信引用
bang
 bang
(@bang)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

επιστημηさん良く分かりました。
比較は「return x->age > y->age」で良いので
dairygoodsさんに教えて頂いたのを使わせて頂く事にします。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました