我在这里看不到问题。但是,我的水晶球告诉我,您想知道您想出的两种方法中更好的方法,以便对向量执行逐分量算术运算,例如a * b + c * d
where a
, b
, c
, d
are vectors ( std::vector<T>
) 具有相同大小:
对于要完成的每个操作,循环遍历元素,执行计算并返回结果向量。将这些操作放在一个向量公式中。
对于输入向量中的每个元素,计算整个表达式并将其写入一个最终结果向量。
有两点需要考虑:
- 性能:在这里,第二个选项领先,因为处理器不会分配不必要的临时向量。
- 可重用性:显然,通过简单地在向量上表达目标公式来实现向量的算法操作并重用它们是很好的。
但是,有一个不错的选项可以实现看起来非常漂亮的第二个选项:
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(我是可变参数模板的新手,所以我不知道句法)。