どういうことがしたいかというと、
for (vector<string>::iterator it = lis.begin(); it != lis.end(); ++it) { cout << *it << endl; }
のようなループをかくのが面倒なので
cout << lis << endl;
のように書きたい。
これをやるにはtemplateパラメータにtemplateをつかってoperator<<をオーバーロードしてやればまあまあ簡単にかける。
forward_iteratorを実装してるコンテナならなんでもいけるはず。ネストしててもOK
テンプレートパラメータが3つのコンテナ用の定義でlessとgreaterに分けてるのは、コンパイラに型推論をうまくやってもらうため。(テンプレートパラメータだけではstringの型と見分けがつかないので)
2011-06-04追記
古いコンパイラだとコンパイルできないかも