大きなstd::vectors
(を渡す)を受け取り、大きなベクトル(値による)を返す関数があります。私のコードの一部では、私が実行する必要があります。イテレータを使用して反復可能な関数をC++にマップする
std::list<std::vector<double> > all_vectors;
// all_vectors is filled with values somewhere in here
for (const std::vector & v : all_values)
{
std::vector<double> res = f(v);
// do something with res
}
と私のコードの別の部分で私が実行する必要があります。
std::list<std::vector<double> > all_vectors;
// all_vectors is filled with values somewhere in here
for (const std::vector & v : all_values)
{
std::vector<double> res = f(v);
// do something different with res
}
最も簡単なオプション(メモリ豚): それにf
をマッピングしてから、結果を調べて// do something with res
または// do something different with res
(いずれの場合も)を実行するだけでコードを再利用することは自明です。これの欠点は、大量の長いリストstd::vector
を格納する必要があることです(不必要に)。一方で、私は私が持っている以上の記憶を使用しないことができるように私は確信しています。それでも、膨大な量のデータを不必要に保存するのは悪い習慣のようです。 一つのオプションは、マップのように動作し、いくつかのiterator_map関数を作成することですが、彼らが必要とされるような結果を生成します。
オプション1(使用イテレータは、それらが要求されているような結果を生成します)。私はこれがPythonのyield
でかなりうまくいくと思います。
オプション2(使用のオブジェクト指向設計は)一回の派生クラスで、g
は// do something with res
を実行するであろう、そして他では、それは// do something different with res
を行うであろう: 別のオプションは、ABC
継承を使用し、機能g
をオーバーライドすることであろう。
オプション3+(???):
私は本当にあなたがC++でこのような問題に対処する方法を上のアドバイスを聞きたいと思います。前もって感謝します。
f(v)はベクトルをフィルタリングし、vの部分集合を返します。 – Jagannath
いいえ、 'f(v)'は 'v'の値の密なガウス平滑を計算します。 – user