min/max更新
更新する対象の名前が長くなる場合、x=min(x,y); や if(x>y){x=y;} と書くのは都合が悪い。
foo[i].bar().baz = min(foo[i].bar().baz, hoge);
まずタイピングが面倒。
さらに、ここで foo が map 等の場合、両辺で1回ずつ O(log(n)) のアクセスが発生するし、bar() も二度呼び出されるので、inline 化されていないとコストが高い。
そもそも bar() が二度の呼び出しで同じ値を返さないかもしれない。
これを避けるには、
int &tmp = foo[i].bar().baz;
tmp = min(tmp, hoge);
などとする必要があって気持ち悪い。
こういうときは、やはり <?= を使いたくなる。
foo[i].bar().baz <?= hoge;
この演算子が使えなかったり使いたくなかったりする場合は自分で書く。
template <class T> inline T &smin(T &a, const T &b) { return (a>b) ? (a=b) : a; }