STL vectorに大小関係が3すくみの型を入れたらどうなるか

大学の先輩に、STL vectorコンテナにじゃんけんみたいな3すくみの大小関係を持つ型を指定してソートさせるとどうなるのかという話をしたら2人とも気になって一緒に書いた。

#include<iostream>
#include<vector>
#include<cstdlib>
using namespace std;

struct janken
{
  enum {Gu,Choki,Pa};
  int type;
  janken(int i):type(i){};
};

char cs[3] = {'G', 'C', 'P'};
ostream &operator<<(ostream &os, const janken &rhs)
{
  os << cs[rhs.type];
  return os;
}

bool operator<(const janken &lhs, const janken &rhs)
{
  return (lhs.type + 3 - 1) % 3 == rhs.type;
}

int main()
{
    srandom(0);
    vector<janken> jv;
    for (int i = 0; i != 10; ++i)
        jv.push_back( janken( random() % 3 ) );

    for (int i = 0; i != 10; ++i)
        cout << jv[i] << ' ';
    cout << '\n';

    sort(jv.begin(), jv.end());

    for (int i = 0; i != 10; ++i)
        cout << jv[i] << ' ';
    cout << '\n';
}

実行結果

$ a
C C G C P C C G G C 
C G P C C C C C G G 

おかしいや。まあそうだろうなあ。trueとfalseみたいにそもそも大小関係が定義できないものはどうなるんだろうか。trueは1,falseは0として扱われて通常どおりにソートされると予想した。

#include<iostream>
#include<cstdlib>
#include<vector>
using namespace std;

int main()
{
    srandom(0);
    vector<bool> v;
    for (int i=0; i<10; i++)
        v.push_back(random()&1 ? true: false);
    for (int i=0; i<10; i++) cout << v[i]; cout << endl;
    sort(v.begin(), v.end());
    for (int i=0; i<10; i++) cout << v[i]; cout << endl;
    return 0;
}

実行結果

$ a
1011110011
0001111111

予想どおり。