ここに質問はありません。しかし、私の水晶玉は、 、、、a * b + c * d
が同じサイズのベクトル ( ) であるようなベクトルに対してコンポーネントごとの算術演算を実行するために思いついた 2 つの方法のうち、より良い方法を知りたいと言っています。a
b
c
d
std::vector<T>
実行する操作ごとに、要素をループし、計算を実行して、結果のベクトルを返します。これらの操作をベクトルの式にまとめます。
入力ベクトルの各要素について、式全体を計算し、それを 1 つの最終結果ベクトルに書き込みます。
考慮すべき点が 2 つあります。
- パフォーマンス: ここでは、プロセッサが不要な一時ベクトルを割り当てないため、2 番目のオプションが優先されます。
- 再利用性: 明らかに、ベクトルのアルゴリズム操作を実装し、ベクトルで目的の式を表現するだけでそれらを再利用できると便利です。
ただし、非常にきれいに見える 2 番目のオプションを実装するための優れたオプションがあります。
std::vector<int> a, b, c, d, e;
// fill a, b, c, d with data
auto expression = [](int a, int b, int c, int d){ return a * b + c * d; };
assert (a.size() == b.size() && b.size() == c.size() && c.size() == d.size());
e.reserve(a.size());
for(auto _a = a.begin(), _b = b.begin(), _c = c.begin(), _d = d.begin(), _e = e.begin();
_a != a.end();
++_a, ++_b, ++_c, ++_d, ++_e)
{
*_e = expression(*_a, *_b, *_c, *_d);
}
このようにして、式をロジックから分離して評価できます。
void componentWise4(std::function<int(int,int,int,int)> f,
const std::vector<int> & a,
const std::vector<int> & b,
const std::vector<int> & c,
const std::vector<int> & d,
std::vector<int> & result)
{
assert (a.size() == b.size() && b.size() == c.size() && c.size() == d.size());
result.reserve(a.size());
for(auto _a = a.begin(), _b = b.begin(), _c = c.begin(), _d = d.begin(), _result = result.begin();
_a != a.end();
++_a, ++_b, ++_c, ++_d, ++_result)
{
*_result = expression(*_a, *_b, *_c, *_d);
}
}
次に、次のように呼び出されます。
std::vector<int> a, b, c, d, e;
// fill a, b, c, d with data
componentWise4([](int a, int b, int c, int d){ return a * b + c * d; },
a, b, c, d, e);
この「式エバリュエーター」は、C++ 11 の新機能「可変個引数テンプレート」を使用して拡張し、式内の任意の数の引数だけでなく、異なる型もサポートできると確信しています。私はそれを機能させることができませんでした (可変個引数テンプレートのこと)、ここで私の試みを完了することができます: http://ideone.com/w88kuG (私は可変個引数テンプレートに慣れていないので、構文)。