【C++】std::sort とラムダ式を使ったカスタムソート
クラスや構造体のソートには、標準ライブラリ <algorithm>
の std::sort
を使う方法があります。
Qt でも同様の qSort
がありましたが、 std::sort
に置き換えることが推奨されています。
次の例は、座標情報のリストに対して、第1ソート条件にX座標の逆順、第2ソート条件にY軸の正順を適用したものです。
QList<QPoint> points({{0, 4}, {2, 2}, {1, 3}, {3, 1}}); std::sort(points.begin(), points.end(), [](const QPoint& p, const QPoint& q) -> bool { if (p.x() == q.x()) { return p.y() < q.y(); } return p.x() > q.x(); }); qDebug() << points; // => (QPoint(3,1), QPoint(2,2), QPoint(1,3), QPoint(0,4))
std::sort
は昇順でソートされます。
第一引数と第二引数は、それぞれコンテナの開始と終了のイテレータです。
第三引数は bool cmp(const T &a, const T &b);
と等価なラムダ式であり、operator<
と同じ意味を持ちます。
つまり、上の例では p < q
となるならば true
、そうでなければ false
となります。