for_eachでbreakするには

 最近のVC++ではlambda functionが使えるようになっているので、ループを書くときは単なるforやwhileでなくSTLの<algorithm>をそれと組み合わせて使うことが多いのだが、その代表であるfor_eachにはbreakが使えないという欠点がある。もちろんgotoもダメ。つまり毎回フルにループしてしまうので、必ずその必要がある用途以外に使うと効率が低下してしまうわけだ。オーダは変わらないとは言うものの、これでは実用上結構な差がつくことがあり得るのではないか。
 breakに代わる手段として思いつくのは2つ。

  1. breakの代わりにthrowする。こんなことをしていると「よくない例外の使い方の典型例」として社内の新人教育講座に取り上げられてしまいそうだ。
  2. for_eachの代わりに常にfind_ifを使う。何かを探しているのでないのにfind_ifを使うと意図がわかりづらくなりそうではある。

 そもそもなぜforやwhileを使いたくないかというと、一つはiteratorの変数宣言がややこしくてできるなら書かないで済ませたいからであり、もう一つはfindとかtransformとかという名前が付いていた方が意図がわかりやすいからである。その観点からするとどちらもイマイチという感じだが、しいて言うなら第二案の方が穏当そうである。ただ、vectorなどのクラスならともかく、単に配列をループするだけなら素直にforを使った方がよさそうな気がする。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください