0

std::vectors大きい(渡された)を受け入れ、const &大きいベクトル(値で)を返す関数があります。コードの一部で、次のことを行う必要があります。

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単純にマッピングしall_valuesて結果を調べ、// do something with resまたは// do something different with res(それぞれの場合)を実行 するだけでコードを再利用するのは簡単です。これの欠点は、(不必要に)大きなstd::vectorの長いリストを保存する必要があることです。一方では、私はそれが私が持っているより多くのメモリを使用しないことを確信しています。しかし、それでも、大量のデータを不必要に保存することは悪い習慣のようです。

オプション1(要求に応じて結果を生成するためにイテレーターを使用): 1つのオプションは、mapのように動作するが、必要に応じて結果を生成するiterator_map関数を作成することです。これはPythonでかなり実行可能だと思いますyield

オプション2(オブジェクト指向設計を使用): 別のオプションは、ABC継承を使用して関数をオーバーライドすることgです。一方の派生クラスでは、gを実行// do something with resし、もう一方のクラスでは、を実行します// do something different with res

オプション3+(???):

C++でこのような問題をどのように処理するかについてのアドバイスを本当に聞きたいです。前もって感謝します。

4

1 に答える 1

1

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

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

リスト内のベクトルから値のマッシュアップコレクションをコンパイルしている場合、イテレータオプションは私にとって最適に聞こえます。呼び出すたびoperator++に、次の要素を動的に計算できます。

于 2012-04-16T01:58:56.060 に答える