Nov 29, 2005

そりゃーstableになんねーよ! 笑

ポスト @ 20:47:33 | プログラミング,C++

本日のドジ。

CContentDataクラスの、特定のメンバで比較を行う Less関数オブジェクトを作りまして、それをstd::stable_sort()に食わせて、std::deque をソートする機能を作りました。

で、それができた後、「同じソート用キーが何度も押されたら、トグルで昇順・降順でのソートを切り替えてくださいよ」てな話になりまして。

std::stable_sort(list.begin(), list.end(), CContentData::HogeLess());

なんてコードで昇順ソートはできていたので、降順用に

std::stable_sort(list.begin(), list.end(), std::binary_negate(CContentData::HogeLess()));

って書いてみたのですがコンパイルエラー。

なんかテンプレート名が解決できません、みたいなエラーだったので、ならとばかり

std::stable_sort(list.begin(), list.end(), std::binary_negate(CContentData::HogeLess()));

これでもまだ別のコンパイルエラー。

なんでかわからず悩みましたが、もしやと思い、HogeLessを

struct HogeLess : public std::binary_function
{
 :

って直したらなんとコンパイル通りました。。。

「あぁなんでかよくわからないけどとにかく解決、ほっ。」という感じでビルドして、いざテストコンテナ起動!

…あれ?? CAtlStringで比較する奴は動いてるのに、boolで比較する奴が、ボタンクリックするたびに位置がずれるよ!

…ぜんぜんstableにならない。

なぜだろう、と思い、ぐぐってみたのですが、結局それについてはわからず。u_u
一方で副産物的に、上記のようなおまじないをしなくても、逆イテレータ使えばいいという話を知り、

std::stable_sort(list.rbegin(), list.rend(), CContentData::HogeLess());

とやったら、見事にstableにソートされました

しかしなんでだろう、なんでnegateだとstableにならないんだろう…???


……
………ぁっ。

not '<' は '≧' じゃん! '>' じゃないじゃん!!

そりゃ、0と1だけでたくさんの項目比較したらおかしくなるわな。  (^^;;;;;;)

Trackback

No Trackbacks

Track from Your Website

http://blog.izumichan.com/trackback/tb.php?id=102

Comment

No Comments

Post Your Comment


*は入力必須です。E-Mailは公開されません。