[英]STL way to add a constant value to a std::vector
标准库中是否有一种算法可以为 std::vector 的每个元素添加一个值? 类似的东西
std::vector<double> myvec(5,0.);
std::add_constant(myvec.begin(), myvec.end(), 1.);
将值 1.0 添加到每个元素?
如果在 STL 中没有一种很好的(例如简短、美观、易于阅读)的方法来做到这一点,那么 boost 怎么样?
如果使用 C++0x,使用 lambda 函数甚至更短:
std::for_each(myvec.begin(), myvec.end(), [](double& d) { d+=1.0;});
看看std::for_each
和std::transform
。 后者接受三个迭代器(序列的开始和结束,以及输出序列的开始)和一个函数对象。 有几种方法可以写这个。 一种方法,只使用标准的东西,是:
transform(myvec.begin(), myvec.end(), myvec.begin(),
bind2nd(std::plus<double>(), 1.0));
您也可以使用for_each
来实现,但std::plus
的默认行为不会将答案写回原始向量。 在这种情况下,您必须编写自己的函子。 简单的例子如下:
struct AddVal
{
double val;
AddVal(double v) : val(v);
void operator()(double &elem) const
{
elem += v;
}
};
std::for_each(myvec.begin(), myvec.end(), AddVal(1.0));
普通 C++0X 中最短的方法是:
for(double& d : myvec)
d += 1.0;
并带有提升:
for_each(myvec, _1 += 1.0); // boost.range + boost.lambda
std::transform( myvec.begin(), myvec.end(),
myvec.begin(), std::bind2nd( std::plus<double>(), 1.0 ) );
如果您有兴趣对向量进行大量数学运算,您可能需要查看标准库的<valarray>
部分。 它基本上是一个std::vector<>
设计用于矢量数值计算(切片、数学函数、逐点运算符等)。
唯一真正糟糕的部分是它与std::vector<>
转换并不容易。
最好的方法是添加std::transform()
和 lambda 表达式。
#include <vector>
#include <algorithm>
std::vector<double> myVector;
double constantElement;
std::transform(myVector.begin(), myVector.end(), myVector.begin(), [&](auto& value){ return value+constantElement; });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.