さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

ソートがやけに重い

 std::sortにやけに時間がかかっていたのでなんでかなーと思ってたけど、クラスが大きすぎて移動に時間がかかっていただけだった。

 移動が起こらないよう、ポインタの配列をつくってそっちをソートすることにする。

 これを

std::vector<T> Ts;

std::sort(Ts.begin(), Ts.end());

 こうじゃ!

std::vector<T> Ts;

std::vector<T*> TPointers;
TPointers.reserve(Ts.size());
for (auto& it : Ts){
  TPointers.push_back(&it);
}

std::sort(TPointers.begin(), TPointers.end(), compare);

 比較関数はこんな感じ。

bool compare(const T* l, const T* r)
{
  return *l < *r;
}

 と、たまにはノウハウ的なことも書いてみたりするけど、なかなか勇気が要るな、これは。