マルチキーのソートでおバカした

in

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.h772 bytes
person.cpp709 bytes
main.cpp1.29 KB

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/401

返信