最も多くの C コンパイラで動作するコードの作成

という項目がMSDNにあったので、見てみたら、なかなか面白いものでした。

だそうです。最初のはまぁ大目に見るとして、問題は2番目です。ためしに設定で無効にしてみたら、

d:\development\microsoft visual studio\vc98\include\winnt.h(357) :
 error C2467: 無名の 'struct' の宣言が誤っています。

というコンパイルエラーが出てしまいました。これでは何も出来ないような気がするんですが…。3番目は、まぁ問題なく。VCのset::eraseとかmultiset::eraseとかがイテレータを返す点は使えるらしいですが、自分はSTLPortを使ってるので逆にそういう書き方をされるとコンパイルできなかったり。他のを調べてみたら、vector::eraseはイテレータ返すみたいです。この辺の仕様はどうなんだろ。ということで、調べて出てきたのはεπιστημηさんの公開著書。
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/container.html#container
うーん、多分これが標準だと思うんですが、引数とかコンテナによってばらばら見たいです。まとめると、

  • iteratorを返すのは
  • voidを返すのは
    • map, multimapにiteratorを渡したとき
    • set, multiset, map, multimapにiteratorのbeginとendを渡したとき
  • set, multiset, map, multimapで要素を指定すると削除した要素数を返す。
となります。STLPortのset, multisetはiterator渡してもvoid返しているようで。それに大してVC6ではbegin, end渡したり、mapやmultimapに対するeraseでもiteratorが返ってきます。なんだこりゃ。「ANSI規格C++ライブラリ」は何処へ。