私は一般的に書いているコードの多くは "このコンテナをループし、いくつかの基準に一致する要素にXを実行する"というパターンに従っていることがわかります。多くの場合、このようになります要素を一致させるためにループをクリーンアップ
は:
std::vector<int> theList(10);
std::iota(theList.begin(), theList.end(), 0);
for (auto i : theList)
{
if ((i % 2) == 0)
{
//Do something with i
}
}
私はこれらの例でif
文を好きではない - 彼らは醜いだと本当にループのロジックで何が起こっているのかを損ないます。
私が望むのは、この問題を解決するためのよりよい方法です。問題の中心はうまく表現されます。
私の最高の試みは、これまですべてが素敵ではありません。
std::vector<int> theList(10);
std::iota(theList.begin(), theList.end(), 0);
auto criteria = [](const int& i) -> bool { return (i % 2) == 0; };
for (auto it = std::find_if(theList.begin(), theList.end(), criteria);
it != theList.end();
it = std::find_if(++it, theList.end(), criteria)
)
{
std::cout << *it << ", ";
}
このパターンはきれいな方法でstd::algorithm
にしてその方法を作る必要があるように感じます。
これを行うには良い方法がありますか?
'がありますstd :: remove_if'を使ってリストをフィルタリングします。他の言語の 'filter'高次関数と同じです。しかし、フィルタリングされたリストは、別々のメモリを格納する必要があります。 – Gassa