2012-04-16 18 views
0

大きな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++でこのような問題に対処する方法を上のアドバイスを聞きたいと思います。前もって感謝します。

+0

f(v)はベクトルをフィルタリングし、vの部分集合を返します。 – Jagannath

+0

いいえ、 'f(v)'は 'v'の値の密なガウス平滑を計算します。 – user

答えて

1

なぜ値でベクトルを返す必要がありますか?あなたが参照して戻ってvector<double>::const_iteratorを使用することができれば、元のベクトルを変更しないことが保証されます。

コピーが必要な場合は、おそらくどちらの場合でも別のコピーが必要なので、オプション0は機能しません。

リスト内のベクトルから値のマッシュアップコレクションをコンパイルする場合は、反復子オプションが私にとって最高の音を出します。operator++を呼び出すたびに、次の要素を動的に計算できます。

+0

結果が 'v'から生成されるので、値で返す必要があります。しかし、反復子であれば、単一の 'const&'戻り値を割り当てて、それを返すことができます。しかし、割り当て/解放コストとは別に、ランタイムはほぼ同じです(戻り値の各要素を計算する必要があり、一度に1つの戻り値のコピーしか存在しません)。 – user

+0

私はイテレータを使用しました。ありがとう! – user

関連する問題