マルチキーのソートでおバカした
Posted 2月 4th, 2012 by hippos
vectorに突っ込んでいるオブジェクトを2つのキーでソート(要するにselect name,age,height from persons order by age,height)したくて、まぁ、operator<をごにょごにょすればなんとかなるかとか思っていたらなんか調子悪くてぜんぜんできない。カッとしてつい、いったんageでソートして、部分的にheightでソートするという暴挙をしでかしてしまった。
struct order_by_height : public binary_function<person,person,bool>
{
bool operator()(const person& lp,const person& rp) {
return lp.height() < rp.height();
}
};
bool person::operator<(const person& p) const
{ // order by age
return this->_age < p.age();
}としといて、
// 一度ageでソート
stable_sort(persons.begin(),persons.end());
// デバグプリント(前)
for_each(persons.begin(),persons.end(),_debug_p);
pair<persons_itr,persons_itr> range_itr;
persons_itr begin_itr = persons.begin();
do
{
// 同一ageの抜き出し
range_itr=equal_range(begin_itr,persons.end(),*(begin_itr));
if (distance(range_itr.first,range_itr.second) > 1)
{// もう一回heightでソート
stable_sort(range_itr.first,range_itr.second,order_by_height());
}
begin_itr = range_itr.second;
} while (begin_itr != persons.end());
// デバグプリント(後)
for_each(persons.begin(),persons.end(),_debug_p);まぁ、なんとなくうまくはいったんですけどもちろん収まりが悪い。で、ちょこっとググったらすぐみつかりましたよ。Multi-Key Sort Algorithmなんでこんな単純なコードを書けなかったんだろ?バカだから?>自分。
bool person::operator<(const person& p) const
{ // order by age,height
if (this->_age != p.age()) return this->_age < p.age();
else return this->_height < p.height();
}これで、stable_sort()一発。恥ずかしくて書けないほど色々試したんだけど!=がどうしてもでてこなかった。こんなにスッキリ書けるなんて。昨日は風邪気味でアタマが重くて...なのか、やっぱり、バカだから?>自分。結構な時間を使い、相当ヘコみました。
せめてもの救いは、「こんなコード間違ってる」という声がずっとアタマの奥の方から聞こえていたことくらいです。
| 添付 | サイズ |
|---|---|
| person.h | 772 bytes |
| person.cpp | 709 bytes |
| main.cpp | 1.29 KB |
この記事のトラックバックURL:
http://hippos-lab.com/blog/trackback/401


最近のコメント
14 weeks 4 days ago
49 weeks 2 days ago
1年 14 weeks ago
1年 14 weeks ago
1年 31 weeks ago
1年 31 weeks ago
1年 31 weeks ago
1年 43 weeks ago
1年 43 weeks ago
2 years 23 weeks ago