1. ホーム
  2. c++

[解決済み] C++で "for "ループの中に "if "条件がある場合、どのように回避すればよいですか?

2022-09-15 08:41:50

質問

私が書くほとんどすべてのコードで、最終的に単純な "if" 条件を内部に持つことになるコレクションについて、集合削減問題を扱うことがよくあります。ここに簡単な例があります。

for(int i=0; i<myCollection.size(); i++)
{
     if (myCollection[i] == SOMETHING)
     {
           DoStuff();
     }
}

関数型言語では、コレクションを別のコレクションに還元して(簡単に)問題を解決し、還元したセットに対してすべての演算を実行することができますね。擬似コードでは

newCollection <- myCollection where <x=true
map DoStuff newCollection

また、C#のような他のC言語では、以下のようなwhere節で削減することができます。

foreach (var x in myCollection.Where(c=> c == SOMETHING)) 
{
   DoStuff();
}

あるいは、より良い(少なくとも私の目には)。

myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));

確かに、私は多くのパラダイムミキシングと主観的/意見に基づくスタイルを行っていますが、C++でこの好ましいテクニックを使えるようにするための、本当に基本的な何かが欠けているような気がしてなりません。どなたかご教示いただけないでしょうか。

どのように解決するのですか?

IMHOでは、ifを含むforループを使用する方がより直截的で可読性が高いです。しかし、これが煩わしい場合は for_each_if のようなものを使うことができます。

template<typename Iter, typename Pred, typename Op> 
void for_each_if(Iter first, Iter last, Pred p, Op op) {
  while(first != last) {
    if (p(*first)) op(*first);
    ++first;
  }
}

使用例です。

std::vector<int> v {10, 2, 10, 3};
for_each_if(v.begin(), v.end(), [](int i){ return i > 5; }, [](int &i){ ++i; });

ライブデモ