[解決済み] 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; });
関連
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] std::stringをintに変換するにはどうしたらいいですか?
-
[解決済み] iostream::eof がループ条件の中 (つまり `while (!stream.eof())`) にあるのはなぜいけないとされているのでしょうか?
-
[解決済み] std::mapで範囲指定for()ループを使用するには?
-
[解決済み] 複数のネストされた「for」ループを終了するためにbreakを使用できますか?
-
[解決済み] ループ内での変数宣言、グッドプラクティスかバッドプラクティスか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】カスタムタイプを「範囲ベースのforループ」で動作させる方法とは?
-
[解決済み】モダンC++はタダで性能を手に入れられる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】'cout'は型名ではない
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)