c++で、

  • 構造体をostreamに流す
  • 構造体を任意の比較関数でソートする
  • 範囲for文を使う

コードの自分用のメモ。

sort関数の最後の引数について

cplusplus.comによると

Binary function that accepts two elements in the range as arguments, and returns a value convertible to bool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines. The function shall not modify any of its arguments. This can either be a function pointer or a function object.

  • compは、bool(に変換可能な)値を返すべし
  • true ⇔ 左辺の方が「小さい(前に来るべき)」
    • 左辺と右辺が「等しい」場合には、falseを返さないと実行時エラーになる可能性がある(と思う)
    • cf: これ
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>

using namespace std;


struct ans{
  int a, b, c;
};

vector<ans> vs;

int bya(ans a, ans b){
  return a.a - b.a;
}

int byc(ans a, ans b){
  return a.c - b.c;
}

ostream& operator<<(ostream& ost, ans x){
  return ost << x.a << " " << x.b << " " << x.c;
}

int main(){
  ans x = {1,2,3};
  ans y = {2,3,1};
  ans z = {3,1,2};
  ans k;
  vs.push_back(x);
  vs.push_back(y);
  vs.push_back(z);
  vs.push_back(k);
  for(auto v: vs){
    cout << v << endl;
  }

  cout << "--" << endl;

  sort(vs.begin(), vs.end(), bya);
  for(auto v: vs){
    cout << v << endl;
  }

  cout << "--" << endl;

  sort(vs.begin(), vs.end(), byc);
  for(auto v: vs){
    cout << v << endl;
  }
  return 0;
}

出力

1 2 3
2 3 1
3 1 2
0 1 0
--
0 1 0
3 1 2
2 3 1
1 2 3
--
1 2 3
2 3 1
3 1 2
0 1 0