4

私はfor_each()構文が好きですが、条件が満たされたときにエスケープすることはできません (例外をスローすることはできますが、それは少しやり過ぎのようです)。

以前はfind_if()そうしていましたが、このように使用するのは少しわかりにくいとマネージャーに感じていました。

MSVS2010 を使用しているためfor(:)、利用できません。

を行う唯一のオプションはありfor(auto i = container.begin(); i != container.end(); ++i)ますか?

4

6 に答える 6

1

この一般的な目的のために小さなアルゴリズムを書くことから始めたいと思います:

template <class Iter, class F, class Cond> 
void for_each_until(Iter b, Iter e, F f, Cond cond) { 
    for( ; b != e; ++b) {
        if (cond(*b))
            return;
        f(*b);
    }
}

これで、タスクはかなり簡単になります。たとえば、 collection 内のfすべてのs を実行し、負の数になったときにブレークするには、次のようなコードを使用します。intc

for_each_until(c.begin(), c.end(), f, [](int i) { return i < 0; } );
于 2013-11-09T03:12:45.500 に答える
0

答えからわかるように、次のことがなければ、std::for_eachランから抜け出すことはできません。

  • 例外をスローする (ハッカー!)
  • そもそも使わないstd::for_each

つまり、あなたは正しかった。はい、適切なループを使用してください。

于 2013-11-09T02:20:30.333 に答える
0

の代わりにstd::for_each、範囲ベースの for ループを使用するのはどうですか?

for (const auto& item : container)
{
    if (!condition_met) { continue; }

    // process item
}
于 2013-11-09T00:03:07.477 に答える
0

ブレークの条件に達したかどうかを追跡するファンクターを作成し、到達した場合はすぐに戻ります。

#include <algorithm>
#include <vector>
#include <iostream>

struct addOneUntilFive {
  void operator() (int& i) {
    if (breakReached)
      return;
    if (i == 5) {
      breakReached = true;
    }
    i += 1;
    std::cout << i << std::endl;
  }

  bool breakReached;
} instance;

int main() {
  std::vector<int> foo{1,2,3,4,5,6,7,8,9};

  std::for_each(foo.begin(), foo.end(), instance);
}
于 2013-11-09T00:06:24.820 に答える